程序是否需要.so共享库中的其他符号,但头文件中声明的符号除外?

sol*_*tim 5 c shared symbols libraries

在C编程中,我认为只要.so文件提供了在头文件中声明的所有符号,就可以成功地将目标文件与.so文件链接.

假设我有foo.c,bar.h和两个库libbar.so.1和libbar.so.2.libbar.so.1和libbar.so.2的实现完全不同,但我认为只要它们都提供在bar.h中声明的函数就可以了.

我将foo.o与libbar.so.1链接并生成了一个可执行文件:foo.bin.当libbar.so.1在LD_LIBRARY_PATH中时,此可执行文件有效.(当然,符号链接是libbar.so)但是,当我将符号链接更改为libbar.so.2时,foo.bin无法运行并抱怨此:

 undefined symbol: _ZSt4cerr
Run Code Online (Sandbox Code Playgroud)

libbar.so.1是一个c ++构建的库,而libbar.so.2是一个ac构建的库.我不明白为什么foo.bin需要那些仅在libbar.so.1本身有意义的c ++相关符号,因为foo.bin是基于纯c代码foo.c构建的.

Rom*_*nko 3

_ZSt4cerr 显然是一个损坏的 C++ 名称。您可能需要检查您是否使用了正确的编译器(gcc/g++,我知道这听起来很愚蠢,但我碰巧遇到了这样的混乱;)),以及 bar.h 文件中是否有任何宏可能会参考 cerr.