Связывание файлов объектов FORTRAN и C++

Я собираюсь вызвать функцию C++ из FORTRAN, для чего я использую модуль ISO_C_Binding. После сжатия основного файла FORTRAN и функции C++ с командами

 gfortran -c mlp8.f90

 g++ -c mean_cpp.cc

Это создаст файлы объектов, но на этапе связывания, как было предложено некоторыми участниками, я собираюсь использовать команды

 g++ mlp8.o mean_cpp.o -o main –lgfortran

т.е. используя компилятор С++ со ссылкой на библиотеки FORTRAN, но он дает ошибку, например

 /Cygnus/cygwin-b20/H-i586-cygwin32/i586-win32/bin/ld: 
   cannot open –lgfortran: No such a file or directory 

 Collect2:ld return 1 exit status 

Поэтому я думаю, что основная проблема заключается в том, что компоновщик g++ не может связываться с библиотеками FORTRAN, поэтому, возможно, мне нужно включить какой-то путь в параметр связывания или, возможно, мне нужно выполнить некоторые настройки в компиляторе g++, чего я не делаю. Не знаю, как это сделать, поэтому, пожалуйста, помогите разобраться с этой проблемой.


person Zahur    schedule 31.08.2011    source источник
comment
Компоновщику не удается найти библиотеку gfortran (имя файла — libgfortran.a или libgfortran.so). Можете ли вы проверить, присутствует ли этот файл в вашем каталоге /lib? Кроме того, я бы изменил командную строку, чтобы поместить файлы .o позади -o main.   -  person fvu    schedule 01.09.2011
comment
Это практически тот же вопрос, что и stackoverflow.com/questions/7255468/, заданный ранее сегодня. Лучше бы их объединили.   -  person M. S. B.    schedule 01.09.2011


Ответы (1)


Вы должны найти файл libgfortran.* (например, с locate из find / -name "libgfortran.*"; или в windows-way Win+g, F3 или любом файловом менеджере), записать путь, где он находится, и сделать

 g++ mlp8.o mean_cpp.o -o main -LPATH_RECORDED –lgfortran

где PATH_RECORDED — путь.

Попробуйте этот список библиотек (получил его из моего mingw gfortran с опцией -v)

 g++ mlp8.o mean_cpp.o -o main -LPATH_RECORDED –lgfortran -lmingw32 -lgcc_s -lgcc -lmoldname  -lmingwex -lmsvcrt
person osgx    schedule 31.08.2011
comment
Я использую для линковки команду (g++ main.o print_hi.o -o main -LC:\gfortran\lib –lgfortran), в которой C:\glfortan\lib - это путь к файлу libgfortran.a, но она дает много такие ошибки, как c:\gfortran\lib/libgfotran.a(transfer.o)(.text$sprintf+0x1b): transfer.c неопределенная ссылка на '_ _mingw_vsprintf' и т. д. и т. д. Что я должен сделать, чтобы решить эту проблему, я также попробуйте слинковать gfortran с обращением к библиотекам C++, но снова выдает много ошибок. Я использую Windows Vista с компиляторами g++ и gfortran. заранее спасибо - person Zahur; 01.09.2011
comment
Большое спасибо за ваш быстрый ответ, который очень полезен. Теперь проблема в том, что если я использую предложенную вами команду (g++ main.o print_hi.o -o main -LC:\gfortran\lib -lgfortran -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt), она дает ошибку (/Cygnus/cygwin-b20/H-i586-cygwin32/i586-cygwin32/bin/1d: не удается открыть –lgcc_s: нет такого файла или каталога) Таким образом, он не может найти этот файл библиотеки, которого нет в обоих gfortran или в папках g++, я даже облазил весь компьютер, но такого файла не нашел. - person Zahur; 01.09.2011
comment
Когда я использую команду без этой опции -lgcc_s, она создает файл main.exe, но когда я запускаю exe, он дает [main] C:\aaa\main.exe 1000 (0) handle_exceptions: Exception: STATUS_STACK OVERFLoW [mian ]mian 1000 (0) handle_exception: дамп трассировки стека в main.exe.core и создание файла с именем main.exe.core - person Zahur; 01.09.2011
comment
Извините, моя команда предназначена для компиляторов mingw. Ваш g++ от cygwin или mingw? А как же гфортран? - person osgx; 01.09.2011
comment
Большое спасибо за указание на это, я удаляю старую версию компилятора gfortran и g++, которую я точно не помню, откуда я загружаю и устанавливаю версию MinGW, подробная процедура установки приведена на mingw.org/wiki/Getting_Started. Я использую установщик интерфейса командной строки. Который теперь работает абсолютно нормально, я пробовал оба вызова с FORTRAN на C++ и наоборот, даже пробовал обе команды как gfortran main.o print_hi.o -o main -lstdc++ g++ main.o print_hi.o -o main –lgfortran Еще раз спасибо - person Zahur; 01.09.2011
comment
Итак, когда ваш вопрос решен, вы можете принять ответ. Слева от ответа, прямо под счетчиком голосов с кнопками ^ и v есть символ v - нажмите на него. - person osgx; 01.09.2011