簡體   English   中英

main的多重定義:將fortran與C ++連接起來

[英]Multiple definition of main: linking fortran with C++

我想編寫一個調用mvndst_()子例程的C ++程序

http://www.math.wsu.edu/faculty/genz/software/fort77/mvndstpack.f

在Linux上,如果我創建test.cc:

extern "C" {
    int mvndst_(int *, double *, double *, int *, double *, int *,
                double *, double *, double *, double *, int *);
};
int main() {
    return 0;
}

並編譯通過

g++ -c -o test.o test.cc
gfortran -c -o mvndstpack.o mvndstpack.f
gfortran -Mnomain -o test test.o mvndstpack.o

然后我明白了

mvndstpack.o: In function `main':
mvndstpack.f:(.text+0x4a2a): multiple definition of `main'
test.o:test.cc:(.text+0x0): first defined here
collect2: ld returned 1 exit status

但是,如果我在鏈接之前運行strip -N main mvndstpack.o ,那么鏈接會成功。 有人可以解釋為什么-Mnomain標志在這里不起作用? 我還想避免使用“strip”的解決方案,因為Mac OS X上“strip”的行為似乎不同(即,-N選項不可用,我不確定另一種方式獲得正確的行為)。 如果可能的話,我還想避免編輯原始的Fortran源代碼。

詳細信息: - GNU Fortran(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1 - g ++(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1 - GNU strip(Ubuntu的GNU Binutils)2.21.53.20110810 - Mac OS上的strip X 10.6雪豹

我找不到-Mnomain選項的任何文檔,但gfortran並沒有抱怨它(似乎將它傳遞給鏈接器)。 但是當我跑步時它也沒有抱怨

gfortran -Mnoplatypus -o test test.o mvndstpack.o

所以我的猜測是它不支持-Mnomain ,並且它被默默地忽略了。 (或者,或者有一個-Mnoplatypus選項,但這似乎不太可能。)

對我PROGRAM TSTNRMmvndstpack.f (第15到62行)中mvndstpack.f PROGRAM TSTNRM .. END行。

無論如何,這可能是最明智的做法; 你不想使用Fortran主程序,所以你不可能不編譯它,而不是試圖欺騙鏈接器忽略它。

(如果您願意,可以使用#if ... #endif#ifdef ... #endif 。)

編輯:

由於您的主程序是使用C ++ gfortran ,因此您可能需要使用g++而不是gfortran來創建可執行文件:

g++ -c -o test.o test.cc
gfortran -c -o mvndstpack.o mvndstpack.f
g++ -o test test.o mvndstpack.o

(在某些時候你真的想要調用這個函數。)

你的問題是你所擁有的FORTRAN代碼還包括一個main ,就在那個世界里它被稱為PROGRAM 來自mvndstpack.f

      PROGRAM TSTNRM
*
*     Test program for MVNDST
*

你需要選擇圍欄的哪一側將首先舉辦派對!

在這種情況下,您希望C ++調用FORTRAN,因此您只需要拋棄包含TSTNRM程序的FORTRAN文件的頂部,或將其包裝在條件編譯部分中:

#if TEST
      PROGRAM TSTNRM
...
      END
#endif

然后,您可以將文件重命名為(case matters) mvndstpack.Fmvndstpack.FPP ,或者在gfortran的命令行選項中使用-cpp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM