2

linux1 つの C++ コードを古いコードと結合する必要があります。fortranここfortanでメイン コードです。私はこの分野の専門家ではなく、簡単なテストから始めようとしていますが、それでもコンパイルできません。私はばかかもしれませんが、実際の例はどこにも見つかりません。リンクをifortで実行できる場合、fortranとcをコンパイルすることができました(後で実際の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

では、このプログラムのリンクを成功させるにはどうすればよいでしょうか?

4

2 に答える 2

4

あなたのメイン(エントリ)はFortranの部分にあるので、それを解決する1つの方法は、g ++の代わりにifortリンカーを使用することです(ifcoreも自動的にリンクします)

ifort ctest.o ftest.o ... -lstdc++
于 2014-02-06T10:53:51.810 に答える
1

そのため、リンクには C++ コンパイラを使用する必要があることを 1 つのページで強調しすぎたようです。以前は、ifort でリンクしようとすると、常に何か他のことが間違っていました。

したがって、現在のバージョンのテスト コードでは、-lstdc++ を指定して ifort を使用するだけで十分です。以前は、何か他のことが間違っていました。

もう一度ありがとうございました。あなた自身のプロジェクトが成功することを願っています!

于 2014-02-06T11:10:23.067 に答える