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