У меня есть проект на С++, который из-за его структуры каталогов настроен как статическая библиотека A
, которая связана с общей библиотекой B
, которая связана с исполняемым C
. (Это кросс-платформенный проект с использованием CMake, поэтому в Windows мы получаем A.lib
, B.dll
и C.exe
, а в Linux мы получаем libA.a
, libB.so
и C
.) Библиотека A
имеет функцию init (A_init
, определенную в A/initA.cpp
)), которая вызывается из библиотеки B
функции init (B_init
, определенной в B/initB.cpp
)), которая вызывается из C
main. Таким образом, при связывании 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
?