我在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?
提前致谢!
答案 0 :(得分:0)
当.so
命令中提到ld
文件时,它将被视为通常的.o
文件。众所周知,.o
文件中的所有符号(在本例中都是libfoo.so
)都必须得到解决。这就是为什么即使在main
程序中你没有调用func_foo()
,该函数仍然需要解决。