У меня есть программа, которая вызывает некоторую библиотечную функцию. Я могу скомпилировать с 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-программы, использующие эту библиотеку.
Если вы можете изменить заголовки для библиотеки 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"
становится проблематичной.
extern "C"
...