G ++ жалуется на «неопределенную ссылку на», в то время как GCC успешно

0

У меня есть программа, которая вызывает некоторую библиотечную функцию. Я могу скомпилировать с GCC. Однако, когда я переключился на G++ 4.7 (так как мне нужно добавить в него код C++), я получил

undefined reference to <a function name here>

Команда компиляции выглядит так:

<gcc or G++> foo.c -o foo <path-to-a-static-library>.a -l<the library>

Библиотека, содержащая вызываемые мной функции, записывается С.

Как я могу это исправить? Перекомпилировать библиотеку с помощью G++? Это плохо, так как у нас есть другие C-программы, использующие эту библиотеку.

  • 7
    Имя калечит !!! extern "C" ...
  • 0
    @ πάνταῥεῖ Thx. Я погуглил результат типа «заголовок кода C должен быть включен в extern, если необходимо использовать в C ++». Итак, если библиотека не имеет этого внешнего C, я ничего не могу сделать?
Показать ещё 4 комментария
Теги:
gcc
g++

1 ответ

1
Лучший ответ

Если вы можете изменить заголовки для библиотеки C, вы должны защитить их соответствующим секцией extern "C":

#ifdef __cplusplus
extern "C" {
#endif

/* C declarations for the library */

#ifdef __cplusplus
}
#endif

Если вы абсолютно не можете изменить файлы заголовков, вы должны убедиться, что вы можете изменить файлы заголовков. Если это по-прежнему абсолютно не является вариантом, попробуйте успеть. Только после столкновения с кирпичными стенами сопротивления помещайте extern "C" декларацию extern "C" вокруг директивы #include:

extern "C" {
#include "c-library-header.h"
}

Причина подхода, заключающегося в использовании extern "C" вокруг #include -directive, заключается в том, что он препятствует будущей миграции файла заголовка, чтобы включить функции C++: поскольку внешние включенные охранники будут засорены вокруг базы кода, это становится кошмар для обслуживания, чтобы исправить их, когда функции C++ отображаются в "c-library-header.h". Это не может считаться большой проблемой для текущего программного обеспечения, но любое успешное программное обеспечение имеет тенденцию к росту, и миграция, такая как удаление объявлений extern "C" становится проблематичной.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню