Я должен пара в linux
один код C ++ со старым fortran
код, где fortan
это основной код. Я не эксперт в этой области, и я пытаюсь начать с простого теста, но все же не могу его скомпилировать. Может быть, я глуп, но нигде не могу найти работающий пример. Мне удалось скомпилировать fortran и c, когда связывание может быть выполнено с помощью ifort (позже потребуется использовать компилятор intel с реальным кодом fortran). Но если я правильно понял, с c++
, связь должна быть сделана c++
компилятор (g++
).
Итак, что я делаю не так здесь:
Мой тестовый код FORTRAN «ftest.f»:
PROGRAM MAIN
IMPLICIT NONE
INTEGER I
write(*,*) "hello fortran1"CALL ctest()
write(*,*) "hello fortran2"
END PROGRAM
И C ++ код «ctest.cpp»
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
extern "C" void ctest_();
void ctest_(){
int i;
// std::cout << "hello c \n";
printf("hello c\n");
}
Я пытаюсь скомпилировать со следующим:
ifort -c ftest.f
g++ -c ctest.cpp
g++ -ldl -lm -limf -L -l -lifcore ctest.o ftest.o
И я получаю ошибку:
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
Итак, что я должен сделать, чтобы связать эту программу?
Ваш основной (вход) находится в части Фортрана, поэтому один из способов решить это — использовать ifort linker вместо g ++ (это также автоматически связывало бы ifcore)
ifort ctest.o ftest.o ... -lstdc++
Похоже, я слишком доверял одной странице, говоря мне, что для компоновки мне нужно использовать компилятор c ++. Раньше просто всегда что-то еще было не так при попытке связать с помощью ifort.
Так что использование ifort с -lstdc ++ действительно достаточно для текущей версии моего тестового кода. Раньше просто что-то еще было не так.
Большое спасибо еще раз, я желаю вам всего наилучшего в ваших собственных проектах!