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

StackOverflow https://stackoverflow.com/questions/1897184

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top