链接到可执行文件时,如何强制将目标文件包含在静态库中?
我有一个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
的main
调用的。因此,在链接时B
,A_init
(以及中定义的所有符号initA.cpp
)都被链接到B
(这是我们期望的行为)。
问题在于,该A
库还定义了旨在动态加载的函数(Af
在中定义A/Afort.f
)(即LoadLibrary
/
GetProcAddress
在Windows上和dlopen
/
dlsym
在Linux上)。由于没有对Af
from库的引用,因此from中的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
?
回答:
原来,我最初的尝试大部分都在那儿。以下作品:
extern "C" void Af(void);void (*Af_fp)(void) = &Af;
对于那些想要一个独立的预处理器宏来封装它的人:
#if defined(_WIN32)# if defined(_WIN64)
# define FORCE_UNDEFINED_SYMBOL(x) __pragma(comment (linker, "/export:" #x))
# else
# define FORCE_UNDEFINED_SYMBOL(x) __pragma(comment (linker, "/export:_" #x))
# endif
#else
# define FORCE_UNDEFINED_SYMBOL(x) extern "C" void x(void); void (*__ ## x ## _fp)(void)=&x;
#endif
因此使用:
FORCE_UNDEFINED_SYMBOL(Af)
以上是 链接到可执行文件时,如何强制将目标文件包含在静态库中? 的全部内容, 来源链接: utcz.com/qa/415348.html