c++ - 链接到可执行文件时如何强制将目标文件包含在静态库中?

标签 c++ linux linker static-libraries

我有一个 C++ 项目,由于其目录结构被设置为静态库 A,它被链接到共享库 B,它被链接到可执行文件C。 (这是一个使用 CMake 的跨平台项目,所以在 Windows 上我们得到 A.libB.dllC.exe,在 Linux 上,我们得到 libA.alibB.soC。)库 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 中定义)通过动态加载(即 Windows 上的 LoadLibrary/GetProcAddress 和 Linux 上的 dlopen/dlsym)。由于库 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 中?

最佳答案

事实证明,我最初的尝试主要是在那里。以下作品:

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)

关于c++ - 链接到可执行文件时如何强制将目标文件包含在静态库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2991927/

相关文章:

c++ - 重新分配 unique_ptr

linux - fatal error : X11/Xauth. h:没有那个文件或目录

c - 以100波特率处理串口

c++ - 在 Makefile 中链接时定义变量的问题

c++ - 我怎么知道哪些库被动态链接到静态库中?

c++ - 选择哪个 Visual C/C++ 运行时库?

c++ - 在 C++ 中将大型文本文件快速读取为一维结构

c++ - 使用 Qt 进行长轮询

python - 如何使用 lldb 调试 C++ pybind11 模块?

linux - 在 Bash 中查找重复字母的字谜