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

C 除了头文件中声明的符号外,程序是否需要.so共享库中的其他符号?,c,symbols,libraries,shared,C,Symbols,Libraries,Shared,在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_路径中时,此可执行文件工作。(当然,符号链接被设置为libbar

在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_路径中时,此可执行文件工作。(当然,符号链接被设置为libbar.so)。但是,当我将符号链接更改为libbar.so.2时,foo.bin无法运行并抱怨:

 undefined symbol: _ZSt4cerr

.1是一个C++构建的库,而LIBAR。2是一个C构建的库。我不明白为什么Fo.Bin需要那些只在LIBAR中有意义的C++相关符号。所以,1本身,因为Fo..Bin是建立在纯C代码Fo.C.< /P>

OZZST4CURR显然是一个被损坏的C++名字。您可能需要检查您是否使用正确的编译器(Gcc/g++,我知道它听起来很愚蠢,但我碰巧遇到这样的混乱;))如果在Bar .h文件中有任何宏可以引用CERP。

< P>在搜索之前必须删除C++名称。对于gcc,有一个c++过滤器实用程序:

$ c++filt
_ZSt4cerr
std::cerr

这只是标准的错误文件流。

你可能忘记把整个程序与C++标准库链接起来。

< P>问题中的语句是错误的。你说,“头文件”,没有“一个和唯一的头文件”。如果你的意思是“声明一个C++类的头文件”,那么,这个类可能继承其他类。或者它可能会使用异常。或者RTTI。在这种情况下,默认情况下,包含与之配套的代码的.so将包含“挂起的未定义符号”。默认情况下,期望是“主”程序是C++的,它链接到C++运行时。
创建一个自包含的是可能的,但是您必须做额外的工作来创建它。您可能需要使用
-Bsymbolic
,或者在链接时指定一些-l库,或者两者兼而有之。这个地区没有很好的文献记载,通常需要一些考古学。

谢谢!这是编译器不匹配。换成另一个问题:在c编程中,我在编译时“包含”来自任何库的头(不是链接)。我是说这个“头文件”。我仍然不太清楚“没有头文件这样的东西”的含义,请你再解释一下好吗?(用C术语来说更好)谢谢!