c - 除了在头文件中声明的那些之外,程序是否需要来自 .so 共享库的其他符号?

标签 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_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/

相关文章:

c - 警告 : comparison between pointer and integer [enabled by default]

javascript - GET 可以与其他库共存吗?

linux - 一个库(.so)可以动态加载另一个用不同编译器构建的库吗

c - 程序知道图中从 1 到 n 的所有可能路径

c99 __restrict 和编译器优化

android - 在 android 中使用 malloc/free

lisp - 符号和名称不同吗?

python - 更改Python比较字符串时的默认逻辑

haskell - 哪个 KeyBoard/KeyBoard Layout 最适合 Haskell 编程? haskell 是否将所有数学符号都作为函数?

winapi - 链接到 Windows API 的 PatchAPI