Как удалить окружающие символы вокруг символа в общей библиотеке?

Я собрал библиотеку с 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 чтобы получить предварительно обработанную форму (и изучить ее).

Другие вопросы по тегам