Я пытаюсь связать файл .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 в будущем.
Далее предполагается, что вы используете инструменты компилятора 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-подобных ОС) с соответствующими библиотеками, связанными с языком, который вы используете. Следовательно, использование одного или другого компилятора для связи не должно иметь значения, если включены правильные библиотеки.
Других решений пока нет …