我在使用Cmake的C ++项目中使用a C library。在该项目中,我正在从该库中构建一个插件。在项目开发过程中,我曾经将这样的文件添加到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
研究插件的内容时,我得到了:
000000000002e1cb T ripemd160
U _Z9ripemd160PKhjPh
表示原始C函数没有错误并且不可用,但是C ++期望错误的函数名称。我不明白。
令我惊讶的是,我还调用了其他文件中的其他函数。例如函数utils_hex_to_bin()
,但在那里我没有得到未定义的符号错误。
为什么C ++期望该函数被特别地修改,而其他所有C函数却不这样?有没有更好的方式来做我在做的事情?我链接不正确吗?
顺便说一下,该文件ripemd160.c
是库中唯一一个带有头文件的文件,而不是包含在include目录中。我不知道这有什么区别。
我还尝试在CMake中为该库创建另一个模块,但这无济于事。
请告知。
编辑:
为了清楚起见,我从未对库中的任何函数进行贴标。我只包含该库中的标头,并负责声明。这就是为什么我从未提到extern "C"
。
已解决:用extern "C"
包裹includes解决了这个问题。显然图书馆开发人员忘记了这一点。
答案 0 :(得分:3)
尝试使用外部变量“ C”声明成熟的md160()函数。或者您可以通过
extern "C" { #include "ripemd160.h" }