Я использую библиотеку 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"
решило проблему. Очевидно, разработчик библиотеки забыл это сделать.