ctor init не вызывает глобальные экземпляры ctor в библиотеке - PullRequest
1 голос
/ 11 июня 2011

Я разрабатываю приложение и библиотеку, используя SourceryGpp lite для arm.

Я не использую стандартные библиотеки или стартовые файлы по умолчанию.Поэтому для вызова глобальных ctrs я делаю следующий код:

ldr r0,=__ctors_init__
ldr r0,[r0]
mov lr,pc
bx r0

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

Ответы [ 2 ]

5 голосов
/ 11 июня 2011

Это хорошо известная проблема со статическими библиотеками и глобальными переменными с инициализацией во время выполнения.

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

Здесь есть хорошее объяснение здесь (окончательное резюме здесь )

У вас будет та же проблема со стандартным кодом запуска, предоставляемым библиотекой.

3 голосов
/ 11 июня 2011

Стандарт явно разрешает отложить инициализацию статических объектов (C ++ 98, [basic.start.init]):

Это определяется реализацией независимо от того, динамическая инициализация или нет (8.5,9.4, 12.1, 12.6.1) объекта области именных пространств выполняется перед первым оператором main.Если инициализация откладывается до некоторого момента времени после первого утверждения main, она должна произойти до первого использования любой функции или объекта, определенных в той же единице перевода, что и объект, который должен быть инициализирован.

(последний черновик C ++ 0x имеет немного другую формулировку.)

Так что, если вы вообще не используете какой-либо модуль перевода, все определенные там объекты могут быть удалены полностью.

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