Программа на C ++, использующая искаженный символ из библиотеки C, вызывающий неопределенный символ - PullRequest
0 голосов
/ 25 июня 2018

Я использую библиотеку 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, я получил:

000000000002e1cb T ripemd160
                 U _Z9ripemd160PKhjPh

, который показывает, что исходная функция C не искажена и недоступна, но C ++ ожидает искаженное имя функции. Это я не понимаю.

Что меня удивляет, так это то, что я также вызываю другие функции в других файлах. Например, функция utils_hex_to_bin(), но я не вижу там этой неопределенной ошибки символа.

Почему C ++ ожидает, что эта функция будет специально искажена, а все остальные функции C - нет? Есть ли лучший способ сделать то, что я делаю? Я неправильно связываю это?

Кстати, этот файл, ripemd160.c - единственный файл в библиотеке, в котором есть файл заголовка, а не в каталоге include. Я не знаю, имеет ли это значение.

Я также пытался создать другой модуль для этой библиотеки в CMake, но это не помогло.

Пожалуйста, сообщите.


EDIT: Просто чтобы прояснить, я никогда не убирал ни одну из функций в библиотеке. Я просто включаю заголовки из этой библиотеки, и это заботится о декларациях. Вот почему я никогда не упоминал extern "C".


Решено: Обтекание включения с extern "C" решило проблему. Очевидно, разработчик библиотеки забыл это сделать.

1 Ответ

0 голосов
/ 25 июня 2018

Попробуйте объявить функцию palemd160 () с помощью внешней буквы "C". Или вы можете сделать это просто

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

...