我有一个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
定义)(在Windows即LoadLibrary
/GetProcAddress
和Linux上dlopen
/dlsym
)。由于没有提及来自库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
?
C实际上是一种脚本语言前端,B是语言引擎,A是引擎使用的一组本机代码方法。我们正在实现一个预先存在的语言,该语言具有定义良好的外部函数接口。 A和B由分开的小组生产;我们希望保留A-team在A目录中写入的所有内容。 – 2010-06-07 20:02:09