Находясь в разделяемой библиотеке C, можно выполнить следующие действия для выполнения инициализатора или финализатора при запуске или завершении программы C, использующей эту разделяемую библиотеку:
BOOL APIENTRY DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
{
if (reason == DLL_PROCESS_ATTACH)
{
_initialize();
}
else if (reason == DLL_PROCESS_DETACH)
{
_finalize();
}
return true;
}
Это не работает, если та же самая программа на C вместо этого использует статическую версию библиотеки C.
Любая идея, как это можно исправить?
Возможно, эта идея поможет (конкретно GCC): geeksforgeeks.org/…





Статическая библиотека "запускается" и "заканчивается", когда программа, частью которой она является, запускается и завершается.
Я взял слова «начинает» и «заканчивает» в кавычках, потому что, как только приложение скомпоновано, статической библиотеки как таковой в нем уже нет. Функции, полученные из статической библиотеки, неотличимы от функций, полученных из приложения.
Итак, если у вас есть что-то, что нужно сделать перед вызовом какой-либо функции в конкретной статической библиотеке, вы должны создать функцию инициализации и вызвать ее явно из своего кода, например. из вашей функции main(). Точно так же, если у вас есть что-то, что нужно сделать после того, как вы закончите использовать функции из статической библиотеки, вы должны создать функцию очистки и вызвать ее явно из своего кода. На самом деле это вполне нормальная практика.
Подумайте также о том, чтобы изменить свою DLL так, чтобы вам приходилось явно выполнять инициализацию точно таким же образом. Это имеет несколько преимуществ:
DLLMain, довольно ограничено. Даже не все функции в DLL ядра безопасно вызывать. Это не относится к явной функции инициализации, вызываемой после загрузки DLL.
Ответ прост: это невозможно. Статическая библиотека на самом деле не что иное, как набор объектных файлов. Для статических библиотек нет специальной инициализации или очистки во время выполнения, поскольку статические библиотеки не загружаются во время выполнения.