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

时间:2015-07-09 00:13:08

标签: c++ c gcc shared-libraries ld

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

libfoo.so,包含1个函数:

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

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

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(); }

但是如果程序只调用独立于libfoo的func_bar1(),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.o中的符号func_bar1(),因此必须在以下库列表中查找它:libbar.so。并且还应检查libbar.so中的所有符号,无论主程序是否需要它们。但我不确定我的理解。

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

.so命令中提到ld文件时,它将被视为通常的.o文件。众所周知,.o文件中的所有符号(在本例中都是libfoo.so)都必须得到解决。这就是为什么即使在main程序中你没有调用func_foo(),该函数仍然需要解决。