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

Уточнить ответ Accordion Guy:

Уведомление, что Proc.new создает proc, будучи переданным блок. Я полагаю, что lambda {...} анализируется как своего рода литерал, а не вызов метода, который передает блок. return луг из блока, присоединенного к вызову метода, возвратится из метода, не блока, и Proc.new, случай является примером этого приведенного в действие.

(Это 1.8. Я не знаю, как это переводит в 1,9.)

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
поделиться