У меня есть проект на С++, который из-за его структуры каталогов настроен как статическая библиотека 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?