代码之家  ›  专栏  ›  技术社区  ›  solotim

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

  •  5
  • solotim  · 技术社区  · 16 年前

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

    我将foo.o与libbar.so.1链接,并生成了一个可执行文件:foo.bin。当libbar.so.1位于LD_LIBRARY_路径中时,此可执行文件工作。(当然,符号链接被设置为libbar.so)。但是,当我将符号链接更改为libbar.so.2时,foo.bin无法运行并抱怨:

     undefined symbol: _ZSt4cerr
    

    4 回复  |  直到 16 年前
        1
  •  3
  •   Roman Dmitrienko    16 年前

    ZZST4CURR显然是一个被破坏的C++名字。您可能需要检查是否使用了正确的编译器(gcc/g++,我知道这听起来很愚蠢,但我碰巧遇到了这样的困惑;),如果bar.h文件中有任何宏可能引用了cerr。

        2
  •  2
  •   osgx    16 年前

    $ c++filt
    _ZSt4cerr
    std::cerr
    

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

        3
  •  0
  •   Å imon Tóth    16 年前

        4
  •  0
  •   bmargulies    16 年前

    问题中的陈述是错误的。你说‘头文件’,没有‘头文件’这样的东西 这个 (一个和唯一)头文件。如果你的意思是“声明某个C++类的头文件”,那么,该类可能继承其他类。或者它可能会使用异常。或者RTTI。在这种情况下,默认情况下,包含与之配套的代码的.so将包含“挂起的未定义符号”。默认情况下,期望是“主”程序是C++的,它链接到C++运行时。

    它是 可能的 -Bsymbolic ,或在链接时指定一些-l库,或两者都指定。这个地区没有很好的文献记载,通常需要一些考古。