gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:14:56 24 4
gpt4 key购买 nike

我在 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?

提前致谢!

最佳答案

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

关于c++ - 如何避免链接不必要的共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31306018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com