繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM