C++ 程序使用 C 库中的损坏符号导致 undefined symbol

标签 c++ c linux cmake shared-libraries

我正在使用 a C library在我的 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() 之后,我的共享库开始出现 undefined symbol 错误:

plugin.so: undefined symbol: _Z9ripemd160PKhjPh

使用nm -g plugin.so 研究插件内容时 | grep -i ripe,我得到了:

000000000002e1cb T ripemd160
                 U _Z9ripemd160PKhjPh

这表明原始 C 函数没有被破坏并且不可用,但 C++ 需要一个被破坏的函数名。我不明白。

令我惊讶的是,我还在其他文件中调用了其他函数。例如函数 utils_hex_to_bin() ,但我没有在那里得到那个 undefined symbol 错误。

为什么 C++ 期望此函数被专门破坏,而所有其他 C 函数却没有?有没有更好的方法来做我正在做的事情?我是否链接不正确?

顺便说一句,那个文件 ripemd160.c 是库中唯一旁边有头文件的文件,而不是在 include 目录中。我不知道这是否有所作为。

我还尝试在 CMake 中为该库创建另一个模块,但这没有帮助。

请指教。


编辑: 需要说明的是,我从未对库中的任何函数进行贴标。我只包含来自该库的 header ,它负责声明。这就是为什么我从未提及 extern "C"


已解决:用 extern "C" 包装 include 解决了这个问题。显然图书馆开发人员忘记了这样做。

最佳答案

尝试用 extern "C"声明 ripemd160() 函数。或者你可以简单地通过

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

关于C++ 程序使用 C 库中的损坏符号导致 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51022634/

相关文章:

c++ - 错误 : request for member 'display' in 'square' , 属于非类类型 'GameBoxes::Box<double>()'

c# - 调用 native C++ 方法时在 Debug模式 (F5) 下崩溃

c++ - 在 C++ 中从 const 字符串初始化 void* 的任何非(char*)正确方法

c - 在 Mono Linux 中将字符串从 native C 动态库 (.so) 发送到 VB .net

c - 从文本文件中读入特定数据(C)

c - 删除 char*,同时保留字符串

linux - 如何在centOS 7中启动apache

c++ - 在 C++ 中替换另一个宏中的一个宏

linux - asm little-endian 寄存器/立即数/内存顺序

c++ - stat 和 read() 的 cpp 文件读取错误