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 ?
提前致谢!
当命令.so中提到某个文件时ld,它将被视为普通.o文件。正如我们所知,.o文件中的所有符号(在本例中是libfoo.so)都必须被解析。这就是为什么即使在main您不调用的程序中func_foo(),仍然需要解析该函数。
| 归档时间: |
|
| 查看次数: |
967 次 |
| 最近记录: |