код инициализации статической переменной никогда не вызывается

У меня есть приложение, использующее статическую библиотеку, которую я сделал. Один файл .cpp в библиотеке имеет объявление статической переменной, ctor которой вызывает функцию для синглтона, которая что-то делает, например. добавляет строку.

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

Я определенно что-то упускаю, но я не знаю, что..


person B..    schedule 13.12.2009    source источник


Ответы (3)


Если у вас есть объект в статической библиотеке, который ЯВНО не используется в приложении. Тогда компоновщик не будет тянуть этот объект из библиотеки в приложение.

Между статическими и динамическими библиотеками есть большая разница.

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

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

person Martin York    schedule 13.12.2009
comment
Вы попали, спасибо. На самом деле он не использовался явно, но я думал, что он сохранит код в том виде, в каком он был в режиме отладки. - person B..; 13.12.2009

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

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

person JaakkoK    schedule 13.12.2009
comment
Спасибо за быстрый ответ. Это определенно не проблема с заказом, так как я уже разобрался с этим. Инициализация неудобна, так как я хочу объявить произвольное количество таких переменных в произвольном количестве файлов cpp, а в процессе выполнения сгенерированный список. - person B..; 13.12.2009

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

person wallyk    schedule 13.12.2009
comment
Дело в том, что статические переменные существуют только для регистрации (в их ctor) статической функции, определенной в файле cpp, в список, чтобы я мог выбрать одну из них позже во время выполнения. Так что понятия независимости в этом контексте, я думаю, нет. - person B..; 13.12.2009