代码之家  ›  专栏  ›  技术社区  ›  The Quantum Physicist

C++程序使用一个C库中的符号导致一个未定义的符号

  •  1
  • The Quantum Physicist  · 技术社区  · 7 年前

    我在用 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” 解决了这个问题。显然图书馆的开发人员忘了这么做。

    1 回复  |  直到 7 年前
        1
  •  3
  •   richq luc    7 年前

    尝试用外部“c”声明ripemd160()函数。或者你可以通过

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