Объединение FORTRAN и C++, ошибка компоновки

Я должен соединить 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

Итак, что я должен сделать, чтобы успешно связать эту программу?


person user3279036    schedule 06.02.2014    source источник
comment
Разве вы не можете использовать GCC для компиляции кода fortran? AFAIR набор компиляторов GCC поддерживает fortran.   -  person πάντα ῥεῖ    schedule 06.02.2014
comment
Ну, проблема была в том, что настоящая программа на Фортране, которую я не могу объединить с С++, это действительно старый и большой код с программированием, зависящим от компилятора. Компиляция с помощью gcc дает несколько неправильные результаты. И исправить это было бы огромной работой.   -  person user3279036    schedule 06.02.2014


Ответы (2)


Ваша основная (запись) находится в части Fortran, поэтому один из способов решить ее — использовать компоновщик ifort вместо g++ (который также автоматически связывал бы ifcore)

ifort ctest.o ftest.o ... -lstdc++
person Peter    schedule 06.02.2014
comment
Привет! Спасибо, но, как я уже сказал, по крайней мере, я читал, что с С++ вы должны использовать компоновщик С++. Если я использую ifort, я получаю ошибки: - person user3279036; 06.02.2014
comment
В то время как время выполнения ifort будет автоматически связано, это для g++ тогда не будет. Что-то вроде -lstdc++ в ... потребуется. - person francescalus; 06.02.2014
comment
Хм, редактирование даже не работает. SO с компоновщиком ifrot я получаю ошибки: ctest.o: в функции __static_initialization_and_destruction_0(int, int)': ctest.cpp:(.text+0x23): undefined reference to std::ios_base::Init::Init()' ctest.o: в функции __tcf_0': ctest.cpp:(.text+0x66): undefined reference to std::ios_base::Init::~Init()' ctest.o :(.eh_frame+0x12): неопределенная ссылка на `__gxx_personality_v0' - person user3279036; 06.02.2014
comment
ЭТО СТРАННО, я ранее пытался связать с ifort и использовал также -lstdc++, но это не сработало. Затем я прочитал этот комментарий в другом месте, что вы должны использовать компоновщик С++, поэтому я не уделял больше внимания этим ошибкам в своем предыдущем комментарии. Но теперь РАБОТАЕТ!!! Может быть, тогда что-то еще было не так с моим источником или что-то еще, но все равно теперь это работает. Большое спасибо! - person user3279036; 06.02.2014
comment
Итак, вы можете использовать ifort для связывания (так что вы согласны с ответом) или вам нужно использовать g++? - person Peter; 06.02.2014
comment
Теперь я в порядке с ответом. Я не знаю, что пошло не так, когда я раньше пытался связать с ifort -lstdc++, но теперь это работает, и я даже не хочу знать, что пошло не так раньше;) Но это вызвало у меня это отчаяние, когда я подумал, что работает решение неверно, а затем я попытался найти другие решения. - person user3279036; 06.02.2014

Так что похоже, что я слишком много на одной странице сказал мне, что я должен использовать компилятор С++ для компоновки. Раньше просто всегда что-то было не так при попытке связать через ifort.

Так что использования ifort с -lstdc++ действительно достаточно для текущей версии моего тестового кода. Раньше просто что-то другое было не так.

Еще раз большое спасибо, желаю вам всего наилучшего в ваших собственных проектах!

person user3279036    schedule 06.02.2014
comment
Вы не должны вводить свой собственный ответ, когда другие в порядке. Вы должны принять их. - person Vladimir F; 06.02.2014
comment
Я думаю, что здесь есть достоверная информация о том, что необходимость связывания с g++ (на самом деле с использованием ld из g++) является дезинформацией. Однако, если ответ @Peter более решительный... - person francescalus; 06.02.2014
comment
@ user3279036 Я предлагаю вам принять ответ Питера. Здесь, в Stackoverflow, мы не говорим спасибо, вместо этого мы принимаем и голосуем за ответы. - person Ali; 06.02.2014