2

我有一个用 C/C++ 编写的库,它的开发人员声明它具有 Fortran 接口。该接口将被启用,包括一个头文件 *.h 并调用一个经典子例程。我想编译我的 Fortran 程序也链接那个库。该库已经过测试并且可以正常工作。

这是主程序:

! 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]”等等其余变量...

我怎样才能解决这个问题?

4

2 回答 2

4

显然,#define类型的 未正确处理。我认为,可能的问题之一是您在 Fortran 中包含头文件的方式,因为您是通过Fortran 语句而不是预处理器指令来完成的。因此,可能仅在文件已经预处理之后才包含它。因此,#define.h 文件中的选项不会被预处理器解析。

include()将语句更改为#include预处理器指令可能会解决问题。

于 2013-01-31T16:31:24.657 回答
3

这条线

#define pastix_uint_t      unsigned INTEGER(kind=4)

将导致大多数 Fortran 编译器出现小问题,因为该语言从未支持使用此语法或任何其他语法的无符号整数。一些异常的实现可能已经支持它们,但它们绝对不是标准的。

于 2013-01-31T16:26:13.777 回答