在 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
libbar.so.1 是 c++ 构建的库,而 libbar.so.2 是 ac 构建的库。我不明白为什么 foo.bin 需要那些仅在 libbar.so.1 本身中有意义的 c++ 相关符号,因为 foo.bin 是建立在纯 c 代码 foo.c 之上的。