如何避免链接不必要的共享库?

Tia*_*ong 5 c c++ gcc shared-libraries ld

我在 Linux 下的 C/C++ 开发过程中发现了一些有趣的东西。例如,有 2 个共享库:

libfoo.so,其中包含 1 个函数:

//------------libfoo.h-----------------
void func_foo();    

//------------libfoo.c-----------------
void func_foo() { return; }
Run Code Online (Sandbox Code Playgroud)

libbar.so,其中包含 2 个函数。其中之一依赖于 libfoo.so:

//-------------libbar.h---------------
void func_bar1();
void func_bar2();

//-------------libbar.c---------------
#include "libfoo.h"

void func_bar1() { return; }
void func_bar2() { return func_foo(); }
Run Code Online (Sandbox Code Playgroud)

但是如果程序只调用func_bar1(),它独立于libfoo,gcc/ld 仍然会尝试搜索func_bar2() 的符号,尽管程序根本不需要它。例如:

//--------------------main.c------------
#include "libbar.h"

int main(int argc, char** argv)
{
    func_bar1();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我通过链接得到以下错误:

gcc main.c -L . -lbar
./libbar.so: undefined reference to `func_foo'
Run Code Online (Sandbox Code Playgroud)

所以我必须这样做才能使它工作:

gcc main.c -L . -lbar -lfoo
Run Code Online (Sandbox Code Playgroud)

链接器似乎无法解析 main.o 中的符号 func_bar1(),因此它必须在以下库列表中查找:libbar.so。并且 libbar.so 中的所有符号也应该检查,无论主程序是否需要它们。但我不确定我的理解。

任何人都可以告诉我,在这种情况下链接是如何工作的。是否有可能避免链接到“不必要的” libfoo ?

提前致谢!

Ngh*_*Bui 0

当命令.so中提到某个文件时ld,它将被视为普通.o文件。正如我们所知,.o文件中的所有符号(在本例中是libfoo.so)都必须被解析。这就是为什么即使在main您不调用的程序中func_foo(),仍然需要解析该函数​​。