Связывание со статической библиотекой C ++ в Mac OS X: конструктор глобального объекта из библиотеки не вызывается - PullRequest
0 голосов
/ 05 июля 2011

Моя статическая библиотека C ++ содержит некоторый глобальный объект с конструктором.Тестовая программа построена с использованием Apple gcc 4.2.1, и после запуска видно, что объект инициализируется нулями, но конструктор не вызывается.То же самое верно для любых статических переменных-членов класса.

Эту проблему можно исправить, предоставив -force_load параметр ld, но этот способ не подходит из-за большого размера исполняемого файла.Я пытался ссылаться на функции из файла, где определен глобальный объект, но это не дало никакого эффекта.

При сборке того же кода в Linux (gcc 4.5.1) таких проблем нет.

1 Ответ

0 голосов
/ 05 июля 2011

Это связано с тем, что при связывании двоичного файла с архивом (.a) компоновщик извлекает только символы из архива, которые не разрешены в двоичном файле.То есть, если двоичный файл не ссылается на этот глобальный (или статический) объект из архива, символ этого объекта и его код инициализации не будут связаны в.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...