如何避免链接不必要的共享库
How to avoid to link the unnecessary shared library?
我在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()
,该函数仍然需要被解析。
相关文章:
- 用callgrind追踪不必要的副本
- 不必要的C++代码最终会出现在我完成的程序中吗?
- 总和的不必要行为C++?
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 如何在插入排序中使用 replace() 使语句变得不必要
- C 包装器C++库周围没有不必要的头文件
- 编译器是否消除了不必要的原子?
- 在 c++ 中不必要的包含
- GCC为AVR上的简单ISR产生不必要的寄存器推送
- 在序列化过程中删除不必要的内存分配
- QTREEWIDGET子分类,停止下降指示器显示给定有不必要的DropIndicatorPosition
- 如何在不指定不必要的模板参数的情况下使用模板类的成员类型
- Android Gradle避免了CMake项目不必要的重建
- 避免使用std::unordered_map(和其他)进行重复搜索或不必要的构造
- 摆脱可变参数模板递归基本情况下不必要的类
- 在多个解决方案之间共享C++静态库会导致不必要的重建
- NetShareEnum(.)winapi无法删除不必要的共享文件夹
- 如何避免链接不必要的共享库