У меня есть несколько библиотек, каждая из которых реализует класс (производный от QObject). Я хотел бы, чтобы каждая из этих библиотек выполняла функцию при первой загрузке. Я нашел пару подобных вопросов здесь:
Автоматически выполняемые функции при загрузке общих библиотек
а также
Как именно работает __attribute __ ((конструктор))?
но любая функция инициализации, которую я создаю на основе ответов, никогда не выполняется. Я попытался создать функцию в пространстве имен, вне пространства имен (а не в моем классе), используя __attribute__
((конструктор)), присвоив ему имя _init и указав имя функции для компоновщика с помощью:
QMAKE_LFLAGS_RELEASE + = -Wl, -init, libinitfunc
Ни один из них не сработал.
Следует также отметить, что я кросс-компилирую эти библиотеки для запуска на встроенном устройстве ARM, которое использует busybox для большей части своей функциональности.
Поскольку это код C ++, вам не нужны хаки в стиле C.
class LibInstance {
public:
LibInstance() {
qDebug() << __FILE__ << "has been initialized";
}
~LibInstance() {
qDebug() << __FILE__ << "has been unloaded";
}
}
Q_GLOBAL_STATIC(LibInstance, libInstance)
class LibExecutor {
LibExecutor() { libInstance(); }
};
static LibExecutor libExecutor;
Экземпляр LibExecutor
гарантированно будет создан без поточной безопасности, прежде чем main()
начинает работать; или до завершения загрузки библиотеки, если она загружена по требованию. LibExecutor
конструктор затем использует Q_GLOBAL_STATIC
реализация потокобезопасно выполнить LibInstance
конструктор.
Он находится в LibInstance
конструктор, который вы размещаете инициализацию функциональности по вашему желанию. Деструктор будет вызываться при выгрузке библиотеки.
Обычно он безопасен, кроссплатформенен и используется внутри самого Qt.
Других решений пока нет …