Краткий ответ для работы Android NDK. Любые статические библиотеки, на которые влияет эта проблема, должны быть добавлены в переменную LOCAL_WHOLE_STATIC_LIBRARIES - на них будет ссылаться, используя флаг -Wl,--whole-archive
, и они не будут подвергаться удалению.
Более длинный ответ для MSVC:
Статические переменные в блоке перевода инициализируются перед любым обычным кодом в
перевод блока выполняется. На практике инициализация происходит, когда содержащий
исполняемая или динамическая библиотека загружена. Когда вызывается ваш \ c main () или ваш вызов
LoadLibrary()/dlopen()
завершено, любые статические переменные будут инициализированы.
Проблема, как описано MSDN :
Конструкторы и присваивание глобальными функциями или статическими методами в объявлении
Не создавать ссылки и не будет препятствовать / OPT: REF устранение. Побочные эффекты от таких
Код не должен зависеть от того, когда нет других ссылок на данные.
Может быть удобно разместить объектный код из нескольких единиц перевода в одном
file, статическая библиотека, условно названная с суффиксом \ c .lib или \ c .a. Компоновщик MSVC делает
анализ зависимостей от статических библиотек и не включает код, на который нет ссылок
включающим субъектом.
Общий шаблон использования статической переменной для объявления и регистрации регистрации
заводской объект может потерпеть неудачу в этом случае - компоновщик MSVC считает статический
быть недоступным и лишает его результата.
* Решения 1022 *
Полезный поиск в Google: http://www.google.com/search?q=msvc+factory+static+library
Одним из решений является установка флага компоновщика /OPT:NOREF
на включающем объекте. Тем не мение,
это настройка «все или ничего», и для нее потребуется, чтобы все включенные библиотеки были полностью связанными.
Если на что-то в файле, содержащем статические ссылки (прямо или косвенно) ссылается
включающая сущность, то по правилам языка сама статика должна быть сохранена.
Самый простой подход - поместить фиктивную функцию в файл и ссылаться на нее из
где-то известно, что считается достижимым.
Другой подход - использовать флаг компоновщика /INCLUDE
для ссылки на объект в файле проблемы.
Предполагая, что сущность с именем DummyForLinkProblem , это можно сделать в источнике включающей сущности:
#pragma comment(linker, "/include:DummyForLinkProblem")
Решение ZooLib
Объекты ZooLib, в настоящее время затронутые этой проблемой, находятся в
ZFile_Win.cpp, ZGRgnRep_HRGN.cpp, ZNet_Internet_WinSock.cpp, ZStreamRWCon_SSL_Win.cpp,
ZTextCoder_Win.cpp и ZUnicode_Normalize_Win.cpp.
Мы #include ZCompat_MSVCStaticLib.h
в соответствующих заголовочных файлах и вставляем в каждый
ZMACRO_MSVCStaticLib_Reference(ModifiedFileName)
. В файлах cpp мы помещаем
ZMACRO_MSVCStaticLib_cpp(ModifiedFileName)
. ModifiedFileName
, как правило,
имя файла с удаленным начальным Z и расширением файла, в том же стиле, что и
используется в ZCONFIG_API_XXX
макросах.
Чтобы убедиться, что ваш исполняемый файл или библиотека не удаляют эти объекты, просто #include
соответствующий заголовочный файл из известного ссылочного кода в вашем включающем объекте. Это будет
приведет к возникновению неисполняемой ссылки, и все будет работать как положено.