2013-01-31 86 views
2

我有一個用C/C++編寫的庫,它的開發者聲明有一個Fortran接口。該界面將被啓用,包括一個頭文件* .h並調用一個經典的子程序。我想編譯我的Fortran程序鏈接該庫。 該庫已經過測試,並且可以正常工作。在Fortran子程序中包含一個c/C++頭文件

這主程序:

! Main program 
INCLUDE 'pastix_fortran.h' 

Program TEST 
IMPLICIT NONE 
call GO_PASTIX 
END PROGRAM TEST 

例程GO_PASTIX是

SUBROUTINE GO_PASTIX 
IMPLICIT NONE 

pastix_data_ptr_t :: pastix_data 
integer :: pastix_comm 
pastix_int_t :: n, rhs, ia(NCOLS+1), ja(NNZER) 
pastix_float_t :: avals(NNZER), b(NROWS) 
pastix_int_t :: perm(NROWS), invp(NROWS), iparm(64) 
real*8 :: dparm(64) 

call pastix_fortran(pastix_data,pastix_comm,n,ia,ja,avals,perm,invp,b,rhs,iparm,dparm) 
END SUBROUTINE 

鑑於文件pastix_fortran.h的類型在子程序中使用的變量中定義:

#define PASTIX_INT_KIND 4 
#define pastix_int_t  INTEGER(kind=4) 
#define pastix_uint_t  unsigned INTEGER(kind=4) 
#define pastix_data_ptr_t INTEGER(kind=4) 
#define MPI_PASTIX_INT  MPI_INTEGER4 
#define pastix_float_t  REAL(kind=8) 
#define MPI_PASTIX_FLOAT MPI_REAL8 

使用VS2010我添加了用/ fpp預處理文件的選項,我沒有忘記添加所有包含的目錄和文件。但是編譯器說:

頁眉臺詞:「警告1個警告#5117:錯誤#預處理線」

的FORTRAN子程序:「錯誤#6404:這個名字沒有一個類型,必須有明確的類型[PASTIX_DATA_PTR_T]「等等其餘的變量...

我該如何解決這個問題?

回答

3

此行

#define pastix_uint_t  unsigned INTEGER(kind=4) 

將會導致大多數Fortran編譯器凌晨的問題,因爲語言從未支持使用這種或任何其他語法無符號整數。一些異常實現可能支持它們,但它們絕對不是標準。

+0

'MPI_INTEGER4','MPI_REAL8'等[在MPI標準中](http://www.mcs.anl.gov/research/projects/mpi/mpi-standard/mpi-report-1.1/node32.htm )作爲可選類型。他們顯然很可怕,但有時候他們會看到他們。 –

3

顯然,該類型的#define未正確處理。我認爲,其中一個可能的問題是您在Fortran中包含頭文件的方式,因爲您正在通過Fortran語句而不是預處理程序指令執行此操作。所以,可能只有在文件已被預處理後纔會包含它。因此,.h文件中的#define選項不會被預處理器解析。

include()聲明更改爲#include預處理器指令可能會解決該問題。

+0

是的。同時也不要忘記編譯器的'-cpp'或'-fpp'標誌。 –

相關問題