C-библиотека, не связывающаяся использующий gcc/g ++

Это довольно прямо. Введите следующую команду

ssh-keygen -t rsa -b 4096 -C "youremailid@yourdomain.com"

Сгенерируйте ключ SSH. Откройте файл и скопируйте содержимое. Перейдите на страницу настроек GitHub и нажмите на ключ SSH. Нажмите Добавить новый ключ SSH и вставьте содержимое здесь. Вот и все :) Вы не должны видеть проблему снова.

22
задан Cœur 28 July 2017 в 03:15
поделиться

3 ответа

Похоже, в вашей библиотеке есть API, который предполагает, что она будет вызываться из C, а не из C ++. Это важно, поскольку C ++ фактически требует, чтобы символы, экспортируемые из библиотеки, содержали больше информации, чем просто имя функции. Это обрабатывается путем "изменения имени" функций.

Я предполагаю, что в вашей библиотеке есть включаемый файл, который объявляет ее открытый интерфейс. Чтобы сделать его совместимым как с C, так и с C ++, вы должны сообщить компилятору C ++, что функции, которые он объявляет, должны предполагать использование связывания и именования C.

Вероятно, простой ответ для проверки - это сделать следующее:

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

в вашем main.cpp вместо того, чтобы напрямую включать customlibrary.h .

Чтобы заголовок работал на обоих языках и правильно объявлял его функции как C-подобные для C ++, поместите следующее в верхней части файла заголовка:

#ifdef __cplusplus
extern "C" {
#endif

и следующее в нижней части:

#ifdef __cplusplus
}
#endif
39
ответ дан 29 November 2019 в 04:29
поделиться

Компилятор C ++ выполняет так называемое изменение имен - имена, которые появляются в вашем коде, не совпадают с теми, которые видит ваш компоновщик. Обычный способ обойти это - сказать компилятору, что определенные функции нуждаются в компоновке C:

// myfile.cpp
extern "C" int libfun();    // C function in your library

или сделать это для всего файла заголовка:

// myfile.cpp
extern "C" {
  #include "mylibdefs.h"      // defs for your C library functions
}
4
ответ дан 29 November 2019 в 04:29
поделиться

Имеется ли в вашем заголовочном файле обычный

#ifdef __cplusplus
extern "C" {
#endif

// ...

#ifdef __cplusplus
} /* extern "C" */
#endif

, чтобы явно указать связывание библиотечных функций C.

.cpp файлы компилируются со связью C ++, т.е. с изменением имен по умолчанию.

2
ответ дан 29 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: