2014-02-06 58 views
2

我應該在linux耦合一個C++代碼與舊的fortran代碼,其中fortan是主代碼。我不是這方面的專家,我嘗試從簡單的測試開始,但仍然無法編譯它。也許我很愚蠢,但我無法在任何地方找到有效的例子。我設法編譯fortran和c,當鏈接可以通過ifort完成時(以後需要使用intel編譯器和fortran代碼)。但如果我理解正確,c++,鏈接必須由c++編譯器(g++)完成。結合FORTRAN和C++,鏈接錯誤

那麼我錯在這裏做的:

我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 

所以我應該做與此程序鏈接成功?

+0

難道你不能使用GCC來編譯fortran代碼嗎? AFAIR GCC編譯器套件支持Fortran。 –

+0

那麼問題是,真正的Fortran程序,我與C++結合在一起,是編譯器依賴編程的真正老式和大型代碼。用gcc編譯會給出錯誤的結果。並糾正這一點,將是一項巨大的工作。 – user3279036

回答

3

你的主要(項)是用Fortran一部分,所以一個解決它是使用ifort linker代替G ++(這也將自動鏈接ifcore)

ifort ctest.o ftest.o ... -lstdc++ 
+0

嗨!謝謝,但正如我所說,至少我正在用C++讀取它,你必須使用C++連接器。如果我使用ifort,我會得到錯誤: – user3279036

+1

雖然'ifort'運行時會自動鏈接,但'g ++'則不會。需要像「...」中的'-lstdC++'這樣的東西。 – francescalus

+0

嗯,編輯甚至不起作用。我用ifrot連接器得到錯誤:ctest.o:在函數'__static_initialization_and_destruction_0(int,int)'中: ctest.cpp :(.text + 0x23):未定義的對std :: ios_base :: Init :: Init )' ctest.o:在函數'__tcf_0'中: ctest.cpp :(。text + 0x66):未定義引用到'std :: ios_base :: Init ::〜Init()' ctest.o :(。eh_frame + 0x12):未定義的引用'__gxx_personality_v0' – user3279036

0

所以看起來像我truested太多辦法在一頁上告訴我,我必須使用C++編譯器進行鏈接。早些時候,當嘗試通過ifort進行鏈接時,總是出現其他問題。

因此,在我的測試代碼的當前版本中,使用帶-lstdC++的ifort已經足夠了。早些時候,別的東西就錯了。

非常感謝你再次,我祝你自己的項目一切順利!

+3

當別人沒事的時候,你不應該輸入你自己的答案。你應該接受他們。 –

+0

我_think_這裏有一些有用的信息,需要用「g ++'鏈接」(真正使用'g ++'中的'ld')是錯誤信息。但是,如果@Peter的答案更強調...... – francescalus

+0

@ user3279036我建議你接受彼得的答案。在Stackoverflow中,我們不會說謝謝,我們接受並讚揚答案。 – Ali