2
我試圖編譯一個調用fortran子例程的c代碼,但我總是得到錯誤。編譯錯誤:找不到「_for_stop_core」
下面是Fortran代碼:
!fort_sub.f90
module myadd
use iso_c_binding
implicit none
contains
subroutine add1(a) bind(c)
implicit none
integer (c_int),intent (inout) :: a
a=a+1
if(a>10) then
stop
endif
end subroutine add1
end module myadd
,這裏是C代碼
//main.cpp
extern "C"{ void add1(int * a); }
int main(void){
int a=2;
add1(&a);
return 0;
}
當我編譯他們
ifort -c fort_subs.f90
icc main.cpp fort_subs.o
我得到錯誤
Undefined symbols for architecture x86_64: "_for_stop_core", referenced from: _add1 in fort_subs.o ld: symbol(s) not found for architecture x86_64
,當我與
icc -c main.cpp
ifort -nofor-main fort_subs.f90 main.o
編譯它們,我得到錯誤
Undefined symbols for architecture x86_64: "___gxx_personality_v0", referenced from: Dwarf Exception Unwind Info (__eh_frame) in main.o "___intel_new_feature_proc_init", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64
那麼,爲什麼有這些錯誤,以及如何解決這些問題?
我知道在ibm編譯器中有一個選項「-lxlf90」,告訴c編譯器鏈接fortran庫,它解決了「_for_stop_core」錯誤。 intel c編譯器有沒有類似的選項?
在我真正的代碼的停止是不是最後陳述fortran子程序。而且它應該能夠請求icc將Fortran庫引入鏈接。你知道那面旗幟嗎?我知道在ibm編譯器中,可以使用'-lxlf90'標誌告訴c編譯器鏈接fortran庫。另外我在真正的代碼中有很多停止聲明,用手改變它們是很乏味的。 – xslittlegrass
@xslittlegrass:我明白了,我猜想我沒有考慮過這個問題(爲了將來的參考:在這個問題中提到一些小細節可能是值得的)。我能夠通過添加編譯器選項「-lifcore」來讓程序編譯和運行。 –
這是什麼--lifcore?當我使用icc不能識別:「ld:庫找不到-lifcore」 – xslittlegrass