У меня есть проект на 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
на окнах и dlopen
/dlsym
на Linux). Поскольку ссылки на Af
отсутствуют в библиотеке B
, символы от 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
?
C на самом деле является интерфейсом языка сценариев, B - движком языка, а A - набором собственных методов кода для использования движком. Мы реализуем уже существующий язык с хорошо определенным интерфейсом внешних функций. А и В производятся отдельными командами; мы предпочли бы сохранить все, что A-команда пишет в каталоге A. –