使用来自C库的错误符号的C ++程序,导致符号未定义

时间:2018-06-25 11:40:02

标签: c++ c linux cmake shared-libraries

我在使用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解决了这个问题。显然图书馆开发人员忘记了这一点。

1 个答案:

答案 0 :(得分:3)

尝试使用外部变量“ C”声明成熟的md160()函数。或者您可以通过

extern "C" { #include "ripemd160.h" }