Я не могу получить функцию execute-on-load для работы в библиотеке с использованием Qt

У меня есть несколько библиотек, каждая из которых реализует класс (производный от QObject). Я хотел бы, чтобы каждая из этих библиотек выполняла функцию при первой загрузке. Я нашел пару подобных вопросов здесь:

Автоматически выполняемые функции при загрузке общих библиотек

а также

Как именно работает __attribute __ ((конструктор))?

но любая функция инициализации, которую я создаю на основе ответов, никогда не выполняется. Я попытался создать функцию в пространстве имен, вне пространства имен (а не в моем классе), используя __attribute__((конструктор)), присвоив ему имя _init и указав имя функции для компоновщика с помощью:

QMAKE_LFLAGS_RELEASE + = -Wl, -init, libinitfunc

Ни один из них не сработал.

Следует также отметить, что я кросс-компилирую эти библиотеки для запуска на встроенном устройстве ARM, которое использует busybox для большей части своей функциональности.

0

Решение

Поскольку это код 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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector