Build 如何从静态库中添加特定符号
我试图使用Build 如何从静态库中添加特定符号,build,compilation,linker,Build,Compilation,Linker,我试图使用--whole archive选项,但它似乎无法与-Xlinker一起使用。如何使用-Xlinker添加此选项 以下是整个故事: 我编写了一个主程序a和几个共享库B1、B2等。主程序将在运行时使用dlopen加载这些共享库。我编译主程序A,链接主程序(S1、S2…等)或共享库(S3、S4…等)使用的所有可能的静态库。然后,我编译共享库而不使用静态库。 调用dlopen时,由于共享库中的符号未定义,程序失败。这个符号确实存在于静态库S3中,但我在主程序的符号表中找不到它 所以我在编译主程
--whole archive
选项,但它似乎无法与-Xlinker
一起使用。如何使用-Xlinker
添加此选项
以下是整个故事:
我编写了一个主程序a和几个共享库B1、B2等。主程序将在运行时使用dlopen加载这些共享库。我编译主程序A,链接主程序(S1、S2…等)或共享库(S3、S4…等)使用的所有可能的静态库。然后,我编译共享库而不使用静态库。
调用dlopen时,由于共享库中的符号未定义,程序失败。这个符号确实存在于静态库S3中,但我在主程序的符号表中找不到它
所以我在编译主程序时添加了--whole archive选项,但符号仍然不存在于最终二进制文件中。在主程序中不直接使用此符号时,如何将其添加到主程序中
所以我在编译主程序时添加了--wholearchive选项
您仍然没有回答以下问题:您使用了什么命令行。在编译时添加链接器选项通常毫无意义:它们只在链接时起作用
对于您描述的情况,正确的链接行是(假设您在UNIX/ELF系统上使用GCC):
重点说明:
-rdynamic
,以便在主菜单中定义符号
可执行文件对dlopen
ed共享库可见--整个存档
和--无整个存档
选项包围假设您使用的是GNU binutils,
--whole archive
可以与-Xlinker
完美结合。您可能想澄清您的问题:您使用了什么命令行,是什么让您相信整个归档文件不起作用,等等。感谢我将整个故事讲得更清楚了。实际上,我正在使用工具生成Makefile,我无法控制--整个归档文件,-l*,--没有整个归档文件的顺序。因此,正如您所指出的,这是因为我想要完全链接的静态库没有遵循——完整存档选项。谢谢,这很有帮助
gcc -rdynamic -o exename main.c \
-Wl,--whole-archive -lS1 -lS2 -Wl,--no-whole-archive