Связывание с gcc, g ++ и gfortran

У меня есть статическая библиотека 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 файл. Есть идеи, что я делаю не так?

1

Решение

Функции в 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 ++ и имеет одинаковую семантику в обоих языках, но редко есть причина для этого.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]