[英]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 TSTNRM
在mvndstpack.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.F
或mvndstpack.FPP
,或者在gfortran的命令行選項中使用-cpp
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.