Как удалить окружающие символы вокруг символа в общей библиотеке?
Я собрал библиотеку с g++
и я хочу связать это с gcc
,
Проблема в том, что я получаю сообщение об ошибке при ссылке на него:
неопределенная ссылка на 'functionName`
(functionName - имя функции в библиотеке)
хотя функция существует в списке символов, и я указываю путь к gcc
во время ссылки.
Это происходит потому, что функция появляется в списке с окружающими символами (я думаю, что это для переопределения?):
Z12functionNameiSt9__va_list
Я знаю, что для удаления этих символов я должен окружить объявление функции extern "C"
, И я сделал это:
//header.hpp
extern "C" int functionName(int argc, ...);
Но окружающие символы все еще появляются вокруг имени функции в списке символов. И вот почему gcc
не могу найти это.
Я кросс-компиляция для Linux рука Йокто с arm-poky-linux-gnueabi-gcc
а также arm-poky-linux-gnueabi-g++
на рабочем столе Ubuntu 16.
Почему не удаляются окружающие персонажи и как я могу их удалить? Я никогда не буду переопределять эту функцию, поэтому, если они действительно предназначены для переопределения, они мне не нужны.
редактировать:
Решаемые. Подпись функции в ее объявлении отличалась от подписи в ее определении... extern
Ключевое слово было даром.
int functionName(int argc, ...); //declaration
int functionName(int argc, va_list args) //definition
2 ответа
Эти персонажи именуются. Они кодируют сигнатуру функции, поэтому перегрузка C++ может работать корректно (например, int foo(int)
а также int foo(float)
разные символы).
Если ваш API - C, вам нужно исправить библиотеку, чтобы не было искажения. Постройте как C или добавьте extern "C"
в своем коде. Если ваш API предназначен для C++, удалите extern "C"
из вашего заголовка.
Если искаженные имена не совпадают (другие искажения), то у вас, вероятно, есть проблема совместимости ABI. В этом случае попытка исправить проблему со связью является неправильным решением. Вы должны убедиться, что вы строите свой код с тем же ABI, что и библиотека.
c++filt
Инструмент должен уметь декодировать искалеченный символ в подписи. Это может быть полезно, чтобы выяснить, в чем разница.
Учитывая, что вы построили библиотеку с g++
и пытаемся связать с gcc
, вероятно, вы хотите C API и перестроить библиотеку с extern "C"
на месте это то, что вам нужно.
"Окружающие персонажи" на самом деле предназначены для искажения имени. Так что лучше говорите о искалеченных именах.
Вы, вероятно, должны добавить
#ifdef __cplusplus
extern "C" {
#endif
рядом с началом вашего (публичного) заголовочного файла (что вы будете лучше кодировать в общем подмножестве C и C++) и соответствие
#ifdef __cplusplus
}; // end of extern "C"
#endif
около его конца. Смотрите также это.
Вы должны обернуть все ваши публичные заголовки (и, возможно, стандартные заголовки C, включенные в них) такими вещами (а не только отдельными функциями).
Вы могли бы скомпилировать с gcc -H
перечислить включенные заголовки или g++ -C -E
чтобы получить предварительно обработанную форму (и изучить ее).