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

How to avoid to link the unnecessary shared library?

本文关键字:共享 不必要 何避免 链接      更新时间:2023-10-16

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

libfoo。因此,其中包含一个函数:

//------------libfoo.h-----------------
void func_foo();    
//------------libfoo.c-----------------
void func_foo() { return; }

libbar。它包含两个函数。其中一个依赖于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(); }

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

//--------------------main.c------------
#include "libbar.h"
int main(int argc, char** argv)
{
    func_bar1();
    return 0;
}

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

gcc main.c -L . -lbar
./libbar.so: undefined reference to `func_foo'

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

gcc main.c -L . -lbar -lfoo

链接器似乎无法解析main中的func_bar1()符号。所以它必须在下面的库列表中查找:libbar。so。还有图书馆里所有的符号。所以也应该检查,不管主程序是否需要它们。但我不确定我是否理解。

谁能告诉我,链接是如何在这种情况下真正工作的。有可能避免链接到'不必要的' libfoo吗?

提前感谢!

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