在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 中时,这个可执行文件工作。(当然符号链接(symbolic link)被创建为 libbar.so)但是,当我将符号链接(symbolic link)更改为 libbar.so.2 时,foo.bin 无法运行并提示这个:
undefined symbol: _ZSt4cerr
libbar.so.1 是一个 C++ 构建的库,而 libbar.so.2 是一个 C 构建的库。我不明白为什么 foo.bin 需要那些只在 libbar.so.1 本身有意义的 c++ 相关符号,因为 foo.bin 是建立在纯 c 代码 foo.c 之上的。
最佳答案
_ZSt4cerr 显然是一个损坏的 C++ 名称。您可能需要检查您是否使用了正确的编译器(gcc/g++,我知道这听起来很愚蠢,但我碰巧遇到了这样的困惑;)),以及 bar.h 文件中是否有任何宏可能具有引用 cerr.
关于c - 除了在头文件中声明的那些之外,程序是否需要来自 .so 共享库的其他符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2369792/