C++ 链接一个库两次和可执行文件的大小

C++ 链接一个库两次和可执行文件的大小,c++,dependencies,static-libraries,C++,Dependencies,Static Libraries,在使用静态库编译程序时,许多来源(包括SO社区)都建议我将库包含两次 例如: gcc main.c -lslA -lslB -lslC -lslA -lslB -o final 这是否会导致更大的可执行文件(.e.链接器是否足够聪明以避免双重包含?) 这(多重包含)是正确的解决方案还是一种解决方法(.e.是否总是存在一种更合适的方法,即使是更难处理的方法) 多次包含库的唯一原因是,例如,slA需要由slB解析的符号,但slB需要由slA解析的符号。链接器只执行一次传递来解析符号,但重复您的库实

在使用静态库编译程序时,许多来源(包括SO社区)都建议我将库包含两次

例如:

gcc main.c -lslA -lslB -lslC -lslA -lslB -o final
  • 这是否会导致更大的可执行文件(.e.链接器是否足够聪明以避免双重包含?)

  • 这(多重包含)是正确的解决方案还是一种解决方法(.e.是否总是存在一种更合适的方法,即使是更难处理的方法)


  • 多次包含库的唯一原因是,例如,
    slA
    需要由
    slB
    解析的符号,但
    slB
    需要由
    slA
    解析的符号。链接器只执行一次传递来解析符号,但重复您的库实际上会导致在该库上执行第二次传递。它不会改变输出的大小,但也没有必要:

    您可以告诉gcc链接器将某些库分组在一起,而不是多次显示您的库——让它执行解析该组中的符号所需的操作。例如:


    gcc main.c-Wl,--start group-lslA-lslB-lslC-Wl,--end group-o final

    不,它不会使可执行文件变大。@n.m.我没想到会这样。这就引出了一个问题:为什么链接器不能自动完成这个任务。在其他链接库中查找
    未定义的引用。为什么排序很重要。如果您在链接器行中多次需要它,那么这听起来更像是混乱的依赖项链接器线性查找依赖项。如果你有
    -lA-lB
    ,链接器是这样运行的:进程A,永远忘记它,进程B。如果B依赖于A,并且相关符号还没有被提取,链接将失败。多次包含库是处理循环依赖关系的一种方法<代码>--开始/结束组
    是另一种(特定于GNU的)方式。不过一开始最好不要吃。