[英]C++ program using a mangled symbol from a C library causing an undefined symbol
我在我的C ++项目中使用C库 ,它使用Cmake。 在那个项目中,我正在从该库中构建一个插件。 在项目开发期间,我曾经将这样的文件添加到cmake中的插件库中:
add_library(plugin SHARED
impl.cpp
Interface.h
${LIBBTC_REPO}/src/base58.c
${LIBBTC_REPO}/src/bip32.c
${LIBBTC_REPO}/src/block.c
${LIBBTC_REPO}/src/ripemd160.c
...
)
一切都很顺利。 但在使用函数ripemd160()
,我的共享库开始给出一个未定义的符号错误:
plugin.so: undefined symbol: _Z9ripemd160PKhjPh
使用nm -g plugin.so | grep -i ripe
研究插件的内容时 nm -g plugin.so | grep -i ripe
,我得到了:
000000000002e1cb T ripemd160
U _Z9ripemd160PKhjPh
这表明原始的C函数没有被破坏而且不可用,但是C ++期望一个错位的函数名。 我不明白。
令我惊讶的是,我还在其他文件中调用其他函数。 例如函数utils_hex_to_bin()
,但我没有得到那个未定义的符号错误。
为什么C ++期望这个函数特别被破坏,而所有其他C函数都没有? 有没有更好的方法来做我正在做的事情? 我错误地链接了这个吗?
顺便说一下,该文件, ripemd160.c
是库中唯一一个旁边有头文件的文件,而不是在include目录中。 我不知道这是否有所作为。
我也尝试在CMake中为该库创建另一个模块,但这没有用。
请指教。
编辑:为了清楚起见,我从未对图书馆中的任何功能进行过涂改。 我只是包含来自该库的标题,并负责声明。 这就是我从未提及extern "C"
。
解决:用extern "C"
包装包含解决了这个问题。 显然,图书馆开发忘了这样做。
尝试使用extern“C”声明ripemd160()函数。 或者你可以简单地做到这一点
extern "C" { #include "ripemd160.h" }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.