【发布时间】:2011-02-28 20:00:36
【问题描述】:
我有一个 C++ 项目,由于其目录结构设置为静态库A,它链接到共享库B,它链接到可执行文件C。 (这是一个使用 CMake 的跨平台项目,所以在 Windows 上我们得到A.lib、B.dll 和C.exe,在Linux 上我们得到libA.a、libB.so 和C。)库@ 987654330@有一个init函数(A_init,定义在A/initA.cpp),它是从库B的init函数(B_init,定义在B/initB.cpp)调用的,它是从C调用的s 主要。因此,在链接B 时,A_init(以及initA.cpp 中定义的所有符号)会链接到B(这是我们想要的行为)。
问题在于A 库还定义了一个函数(Af,在A/Afort.f 中定义),该函数旨在通过动态加载(即Windows 上的LoadLibrary/GetProcAddress 和dlopen /dlsym 在 Linux 上)。由于库B 中没有对Af 的引用,因此A/Afort.o 中的符号不包含在B 中。在 Windows 上,我们可以使用 pragma 人为地创建引用:
#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++ linux linker static-libraries