我有一個Fortran主程序,下面有很多子程序。其中一個子程序調用C++函數。該C++函數調用另一個Fortran子例程。現在我需要將它們全部編譯在一起以獲取輸出。 我試圖用icl編譯C++文件。然後,我使用ifort作爲Fortran文件和爲C++創建的對象文件之間的鏈接器。但該方法不起作用。它顯示無法解析的外部符號。編譯Fortran和C++程序並從intel編譯器鏈接
-2
A
回答
0
我希望你至少看到這個:https://software.intel.com/en-us/node/691954
他們所寫的大多是有指C,雖然存在的C++庫提。如果你與C++ ocde鏈接,你需要那些。 您應該閱讀關於在C++中改變符號名稱的信息。由於C++支持過載的功能,但鏈接器需要獨特的符號,因此對於函數foo(int i,float j),C++生成 類似_foo****@8
而不是foo
,其中*取決於編譯器和參數類型。
如果使用BIND(C),Fortran代碼將生成C風格的符號,您可以強制C++爲函數生成一個,方法是使用C++代碼中的extern "C"
爲從C++調用的fortran函數的原型以及函數從Fortran中調用。
本例使用C編譯器,但對於C++,您需要更改生成的符號(https://software.intel.com/en-us/node/691929#92BDCE7A-30FA-4A60-BCDB-7CE1521572EC)。請注意,C和Fortran的互操作性不是標準化的,通常不能從一個編譯器集合移植到另一個編譯器集合。我不得不處理Compaq編譯器修改函數名稱的問題,但不是以C++方式,或者PGI Fortran需要stdcall約定。
Fortran代碼實施例
subroutine Simulation(alpha, beta, gamma, delta, arrays) BIND(C)
use, intrinsic :: ISO_C_BINDING
implicit none
integer (C_LONG), value :: alpha
real (C_DOUBLE), intent(inout) :: beta
integer (C_LONG), intent(out) :: gamma
real (C_DOUBLE),dimension(*),intent(in) :: delta
type, BIND(C) :: pass
integer (C_INT) :: lenc, lenf
type (C_PTR) :: c, f
end type pass
type (pass), intent(inout) :: arrays
real (C_FLOAT), ALLOCATABLE, target, save :: eta(:)
real (C_FLOAT), pointer :: c_array(:)
...
! Associate c_array with an array allocated in C
call C_F_POINTER (arrays%c, c_array, (/arrays%lenc/))
...
! Allocate an array and make it available in C
arrays%lenf = 100
ALLOCATE (eta(arrays%lenf))
arrays%f = c_loc(eta)
...
end subroutine Simulation
C結構聲明例
struct pass {int lenc, lenf; float *c, *f;};
C函數原型實施例
void simulation(long alpha, double *beta,
long *gamma, double delta[], struct pass *arrays);
C調用序列實施例
simulation(alpha, &beta, &gamma, delta, &arrays);
相關問題
- 1. 編譯Fortran程序和編譯器/庫
- 2. 編譯與intel編譯器icpc在linux的C++程序
- 3. Visual Studio,Intel Visual Fortran和Visual C/C++混合語言編譯
- 4. 編譯和鏈接miracl C++
- 5. C++編譯鏈接
- 6. 與Fortran編譯器和C++庫衝突
- 7. 鏈接錯誤「LogonUser」編譯C++程序?
- 8. intel Fortran編譯器(ifort)有編譯和編譯後自動運行可執行文件的選項嗎?
- 9. Fortran編譯器爲mac讀取程序
- 10. C++遺傳編程:調用鏈接器/編譯器,執行編譯後的程序和管道輸入/輸出
- 11. 使用記事本++和英特爾編譯器編譯文件Fortran編譯器
- 12. Fortran 95編譯器是否可以編譯Fortran 77代碼?
- 13. 爲iPhone編譯外部C++庫(Octave)(Fortran編譯器缺失?)
- 14. 什麼是Fortran編譯器?
- 15. C++程序編譯
- 16. 編譯C++程序
- 17. 編譯mysql連接器用mingw編譯C++,編譯錯誤
- 18. Borland C++編譯器中的鏈接DLL
- 19. 在Objective-C編譯器上編譯不正確的C程序
- 20. 鏈接和編譯pcl
- 21. iOS編譯和鏈接庫
- 22. 編譯和鏈接錯誤
- 23. fortran編譯blas程序錯誤
- 24. 如何安裝Fortran編譯器(gcc42-fortran)
- 25. 無法編譯鏈接列表程序
- 26. boost :: geometry :: area無法在intel編譯器上編譯
- 27. FORTRAN編譯錯誤
- 28. Fortran編譯錯誤
- 29. 爲32位架構編譯和鏈接一個C程序
- 30. 用C++編譯器編譯c代碼
提供最小示例https://stackoverflow.com/help/mcve,從調用的Fortran C,FORTRAN或從C到獲得超過只是理論建議? – Swift
你能提供更多的信息,如代碼示例嗎? –
我只需要知道編譯過程。就像如果只有fortran子例程那麼:ifort/c * .f和之後的ifort/exe:trial1 * .obj。因此,如果在C++中有子程序,那麼需要修改哪個命令。 –