«__Gfortran_pow_c8_i4» ошибка при связывании .o файлов с г ++ и gfortran с помощью г ++

Обновить

April 2019

Просмотры

345 раз

1

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

1 ответы

4

The following assumes you are using the GNU compiler tools. Things may be slightly different if you are using other compilers.

You can use either compiler to link the two together, but you need to provide the appropriate libraries.

Typically, you can use either

gfortran fortobj.o cppobj.o -lstdc++

or

g++ fortobj.o cppobj.o -lgfortran

This assumes that you are using a setup where both compilers know about each other's libraries (like if you installed through a linux repository).


In the case of the OP the C compilers came from XCode and gfortran is from homebrew. In that case, gfortran knows about the g++ libraries (since they were used to compile the compiler), but g++ doesn't know about the gfortran libraries. This is why using gfortran to link worked as advertised above. However, to link with g++ you need to add the path to libgfortran.* when you call the linker using the -L flag, like

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

If for some reason your gfortran compiler is unaware of your g++ libs, you would do

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

Note that there shouldn't be any difference in the final executable. I'm no compiler expert, but my understanding is that using the compiler to link your objects together is a convenience for calling the linker (ld on UNIX-like OS's) with the appropriate libraries associated with the language you are using. Therefore, using one compiler or the other to link shouldn't matter, as long as the right libraries are included.