Как инициализировать общую библиотеку по Linux

Я разрабатываю общую библиотеку с помощью C++ в соответствии с Linux, и я хотел бы, чтобы эта библиотека использовала log4cxx для входа целей. Однако я не уверен, как настроить это. Чтобы log4cxx работал, я должен создать объект регистратора. Как я могу удостовериться, что этот объект создается, когда моя библиотека загружается?

Я подозреваю, что будет самым легким создать объект регистратора как глобальную переменную и затем использовать его от любого из исходных файлов моей библиотеки, объявляя его как экстерна в заголовках. Но как мне можно было создать регистратор автоматически, после того как приложение соединяется с библиотекой?

Я знаю, что в DLLs для Windows, существует вещь как REASON_FOR_CALL == PROCESS_ATTACH; в соответствии с Linux существует ли подобная вещь?

11
задан dave 2 August 2019 в 07:35
поделиться

3 ответа

В C ++ под Linux глобальные переменные создаются автоматически, как только библиотека загружается. Так что это, вероятно, самый простой путь.

Если вам нужно вызвать произвольную функцию при загрузке библиотеки, используйте атрибут конструктора для GCC:

__attribute__((constructor)) void foo(void) {
    printf("library loaded!\n");
}

Функции конструктора вызываются динамическим компоновщиком при загрузке библиотеки . Именно так и реализована глобальная инициализация C ++.

20
ответ дан 3 December 2019 в 02:20
поделиться

Если вы хотите, чтобы ваш код был переносимым, вам, вероятно, следует попробовать примерно так:

namespace {
  struct initializer {
    initializer() {
      std::cout << "Loading the library" << std::endl;
    }

    ~initializer() {
      std::cout << "Unloading the library" << std::endl;
    }
  };
  static initializer i;
}
10
ответ дан 3 December 2019 в 02:20
поделиться

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

Я бы порекомендовал взглянуть на реализацию Loki Singleton .

Существуют различные политики времени жизни, одна из которых - Phoenix , которая поможет вам избежать этого. фиаско.

Когда вы это сделаете, прочтите Modern C ++ Design, в котором подробно объясняются проблемы, с которыми сталкивается синглтон, а также способы использования различных политик.

3
ответ дан 3 December 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: