У меня есть статическая библиотека matrixlib.a
который я использую для составления некоторых C
код. Этот код скомпилирован с gcc
и работает нормально. Однако я хотел бы представить эту библиотеку в C++
код, а затем это, когда проблемы начинаются.
То, как я собираю C
код:
gcc -I / matrix / include -O -Wall example.c -c -o example.o
gfortran example.o /matrix/lib/matrixlib.a -lblas -fopenmp -o example_c
Если сейчас мы поменяемся gcc
за g++
:
example.c :(. text + 0xf5): неопределенная ссылка на `mygemm_solver (int,
double const *, double *, double *, int, int) ‘
являющийся mygemm_solver
функция, которую я использую example.c
файл. Есть идеи, что я делаю не так?
Функции в example.c
вероятно не объявлены extern "C"
Таким образом, компилятор C ++ применяет преобразование имен к сгенерированному имени символа. Код Фортрана, скорее всего, не использует искаженное имя, поэтому, когда компоновщик пытается найти его, символ не может быть найден.
Первый шаг — поместить прототипы всех функций, которые вы хотите «экспортировать» из кода C / C ++, в файл заголовка. Поместите это наверху:
#ifdef __cplusplus
extern "C" {
#endif
И тогда это внизу:
#ifdef __cplusplus
}
#endif
Это имеет эффект автоматического применения extern "C"
ко всем функциям, объявленным в заголовке, но только когда вы компилируете как C ++.
Однако важно отметить, что C и C ++ — это разные языки с разной семантикой (например, в отношении неявного преобразования из void *
). Вы должны скомпилировать код C с помощью компилятора C, а код C ++ — с помощью компилятора C ++. Технически возможно написать код, который является допустимым C и C ++ и имеет одинаковую семантику в обоих языках, но редко есть причина для этого.
Других решений пока нет …