我在用
a C library
在我的C++项目中,它使用cFug。在那个项目中,我正在那个库中构建一个插件。在项目开发过程中,我经常在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
是库中唯一在其旁边有头文件的文件,而不是包含目录中的文件。我不知道这会不会有什么不同。
我还尝试在cmake中为该库创建另一个模块,但这没有帮助。
请告知。
编辑:
为了清楚起见,我从来没有在图书馆的任何功能上做过标记。我只包括那个库中的头,它负责声明。所以我从没提过
extern "C"
.
已解决:用包装include
外部“C”
解决了这个问题。显然图书馆的开发人员忘了这么做。