& Quot; __ gfortran_pow_c8_i4 & Quot; ошибка при связывании файлов .o из g ++ и gfortran с использованием g ++

Я пытаюсь связать файл .o, созданный с помощью g ++, и другой файл .o, созданный с помощью gfortran.

g++ -c mycppcode.cpp

производит файл mycppcode.o и команда

gfortran -c myfortrancode.f

производит файл myfortrancode.o

Когда я связываю эти два файла, чтобы получить выходной файл

g++ -O mycppcode.o myfortrancode.o

Я получаю следующую ошибку

Undefined symbols for architecture x86_64:
"__gfortran_pow_c8_i4", referenced from:

Может ли кто-нибудь помочь мне с этим? Должен ли я использовать другой компилятор? Кроме того, я хотел бы знать, что функции или подпрограммы вызывают «__gfortran_pow_c8_i4», чтобы я мог попытаться избежать этих функций или подпрограмм в fortran в будущем.

0

Решение

Далее предполагается, что вы используете инструменты компилятора GNU. Вещи могут немного отличаться, если вы используете другие компиляторы.

Вы можете использовать любой компилятор, чтобы связать их вместе, но вам нужно предоставить соответствующие библиотеки.

Как правило, вы можете использовать либо

gfortran fortobj.o cppobj.o -lstdc++

или же

g++ fortobj.o cppobj.o -lgfortran

Это предполагает, что вы используете установку, где оба компилятора знают о библиотеках друг друга (например, если вы установили через репозиторий linux).


В случае OP компиляторы C пришли из XCode и gfortran из доморощенного. В таком случае, gfortran знает о g++ библиотеки (так как они использовались для компиляции), но g++ не знает о gfortran библиотеки. Вот почему с помощью gfortran чтобы ссылка работала как рекламируется выше. Тем не менее, чтобы связать с g++ вам нужно добавить путь к libgfortran. * когда вы вызываете компоновщик с помощью -L флаг, как

g++ fortobj.o cppobj.o -L/path/to/fortran/libs -lgfortran

Если по какой-то причине ваш gfortran компилятор не знает о вашем g++ libs, вы бы сделали

gfortran fortobj.o cppobj.o -L/path/to/c++/libs -lstdc++

Обратите внимание, что в конечном исполняемом файле не должно быть никакой разницы. Я не эксперт по компилятору, но я понимаю, что использование компилятора для связывания ваших объектов удобно для вызова компоновщика (ld в UNIX-подобных ОС) с соответствующими библиотеками, связанными с языком, который вы используете. Следовательно, использование одного или другого компилятора для связи не должно иметь значения, если включены правильные библиотеки.

3

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

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

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