У меня есть проект C ++, который в силу своей структуры каталогов настроен как статическая библиотека A
, которая связана с общей библиотекой B
, которая связана с исполняемым файлом C
. (Это кроссплатформенный проект с использованием CMake, поэтому в Windows мы получаем A.lib
, B.dll
и C.exe
, а в Linux мы получаем libA.a
, libB.so
и C
.) Библиотека A
имеет функцию инициализации (A_init
, определенную в A/initA.cpp
), которая вызывается из библиотеки B
Функция инициализации (B_init
, определенную в B/initB.cpp
), которая вызывается из C
' с основной. Таким образом, при связывании B
, A_init
(и все символы, определенные в initA.cpp
) связываются с B
(что является нашим желаемым поведением).
Проблема заключается в том, что библиотека A
также определяет функцию (Af
, определенную в A/Afort.f
), которая предназначена для динамической загрузки (например, LoadLibrary
/ GetProcAddress
в Windows и dlopen
/ dlsym
в Linux). Поскольку в библиотеке B
нет ссылок на Af
, символы из A/Afort.o
не включаются в B
. В Windows мы можем искусственно создать ссылку, используя прагму:
#pragma comment (linker, "/export:_Af")
Поскольку это прагма, она работает только в Windows (с использованием Visual Studio 2008). Чтобы заставить его работать в Linux, мы попытались добавить следующее к A/initA.cpp
:
extern void Af(void);
static void (*Af_fp)(void) = &Af;
Это не означает, что символ Af
будет включен в окончательную ссылку B
. Как заставить символ Af
быть связан с B
?