Compilation gfortran:非法的预处理器指令&;无效字符/非数字字符编译错误

Compilation gfortran:非法的预处理器指令&;无效字符/非数字字符编译错误,compilation,preprocessor,fortran,gfortran,directive,Compilation,Preprocessor,Fortran,Gfortran,Directive,因此,我尝试使用NAS基准测试特定MPI实现的性能。所以我去编译fortran代码,我遇到了一个障碍。每当我输入此命令进行编译时: gfortran -O0 -Wall -I/home/stephen/trunk/include -I. -c ./TestData/common/timers.f 我发现以下编译器错误: Warning: mpif.h:2: Illegal pdreprocessor directive Warning: mpif.h:3: Illegal preproces

因此,我尝试使用NAS基准测试特定MPI实现的性能。所以我去编译fortran代码,我遇到了一个障碍。每当我输入此命令进行编译时:

gfortran -O0 -Wall -I/home/stephen/trunk/include -I.  -c ./TestData/common/timers.f
我发现以下编译器错误:

Warning: mpif.h:2: Illegal pdreprocessor directive
Warning: mpif.h:3: Illegal preprocessor directive
Warning: mpif.h:4: Illegal preprocessor directive
Warning: mpif.h:5: Illegal preprocessor directive
Warning: mpif.h:6: Illegal preprocessor directive
Warning: mpif.h:7: Illegal preprocessor directive
Warning: mpif.h:8: Illegal preprocessor directive
Warning: mpif.h:9: Illegal preprocessor directive
Warning: mpif.h:12: Illegal preprocessor directive
Warning: mpif.h:13: Illegal preprocessor directive
Warning: mpif.h:14: Illegal preprocessor directive
Warning: mpif.h:2: Illegal preprocessor directive
Warning: mpif.h:3: Illegal preprocessor directive
Warning: mpif.h:4: Illegal preprocessor directive
Warning: mpif.h:5: Illegal preprocessor directive
Warning: mpif.h:6: Illegal preprocessor directive
Warning: mpif.h:7: Illegal preprocessor directive
Warning: mpif.h:8: Illegal preprocessor directive
Warning: mpif.h:9: Illegal preprocessor directive
Warning: mpif.h:12: Illegal preprocessor directive
Warning: mpif.h:13: Illegal preprocessor directive
Warning: mpif.h:14: Illegal preprocessor directive
mpif.h:1.1:
    Included at ./TestData/common/timers.f:30:

/*
 1
Error: Non-numeric character in statement label at (1)
mpif.h:1.2:
    Included at ./TestData/common/timers.f:30:

/*
  1
Error: Invalid character in name at (1)
mpif.h:1.1:
    Included at ./TestData/common/timers.f:50:

/*
 1
Error: Non-numeric character in statement label at (1)
mpif.h:1.2:
    Included at ./TestData/common/timers.f:50:

/*
  1
Error: Invalid character in name at (1)
make: *** [cg] Error 1
以下是出错的timers.f代码(第30行和第50行为包含行):

有什么想法吗?我已经尝试了gfortran的各种命令行参数,试图让它进行不同类型的预处理(我承认,大多数都是盲目地进行的)。对我来说,奇怪的是编译器在我的代码中没有的非数字字符/*上出错,所以我很迷茫


谢谢

您肯定是在以非标准方式编译此代码。使用mpi编译f77或f90代码的常用方法是使用程序mpif77mpif90,这些程序围绕用于构建特定版本mpi的编译器运行

例如,在我的笔记本电脑上(使用gfortran/gcc编译的OpenMPI),命令
mpif77
大致相当于:

gfortran -I/usr/local/include -L/usr/local/lib -lmpi_f77 -lmpi -lopen-rte -lopen-pal -lutil
(我是通过
mpif90-showme
获得此信息的——我不知道该命令行选项是否是MPI标准的一部分,因此它可能不适用于您)

要编译您的代码,我将尝试以下方法:

mpif77 -O0 -Wall -c ./TestData/common/timers.f -o timers.o
由于没有其他要包含的文件,因此使用附加的
-I
标志来增加编译器的包含路径实际上没有意义——您只是增加了意外发现错误头文件的可能性;)


可能在您当前的目录或/home/stephen/trunk/include中有一个文件“mpif.h”,该文件本不应该被选中。(看起来您可能看到了一个C头文件,因为
/*
是C注释的开头——尽管我不明白为什么C头文件会被称为“mpif.h”)。

您肯定是在以非标准方式编译此代码。使用mpi编译f77或f90代码的常用方法是使用程序mpif77mpif90,这些程序围绕用于构建特定版本mpi的编译器运行

例如,在我的笔记本电脑上(使用gfortran/gcc编译的OpenMPI),命令
mpif77
大致相当于:

gfortran -I/usr/local/include -L/usr/local/lib -lmpi_f77 -lmpi -lopen-rte -lopen-pal -lutil
(我是通过
mpif90-showme
获得此信息的——我不知道该命令行选项是否是MPI标准的一部分,因此它可能不适用于您)

要编译您的代码,我将尝试以下方法:

mpif77 -O0 -Wall -c ./TestData/common/timers.f -o timers.o
由于没有其他要包含的文件,因此使用附加的
-I
标志来增加编译器的包含路径实际上没有意义——您只是增加了意外发现错误头文件的可能性;)



可能在您当前的目录或/home/stephen/trunk/include中有一个文件“mpif.h”,该文件本不应该被选中。(看起来您可能看到了一个C头文件,因为
/*
是C注释的开头——尽管我不明白为什么C头文件会被称为“mpif.h”)。

我同意您应该使用mpif77或mpif90链接到正确的库。如果gfortran不喜欢预处理器宏,您应该尝试使用-cpp编译器选项。

我同意您应该使用mpif77或mpif90链接到正确的库。如果gfortran不喜欢预处理器宏,则应尝试使用-cpp编译器选项。

尝试将正在使用的文件后缀从.f更改为.f90,并将注释行初始字符从c更改为!您使用的是哪种MPI实现?能否从包含的
mpif.h
的开头发布几行内容?mpif.h看起来很像C头。您不应该在Fortran源文件中导入这些内容。@Talonmes:虽然我同意您的说法,但Fortran MPI程序通常会
包含mpif.h
,而不是
使用MPI
。mpi-f-for-fortran。请尝试将正在使用的文件后缀从.f更改为.f90,并将注释行初始字符从c更改为!您使用的是哪种MPI实现?能否从包含的
mpif.h
的开头发布几行内容?mpif.h看起来很像C头。您不应该在Fortran源文件中导入这些内容。@Talonmes:虽然我同意您的说法,但Fortran MPI程序通常会
包含mpif.h
,而不是
使用MPI
。mpi-f-for-fortran。这些选项绝对不是mpi标准,并且是特定于实现的。-I.和-I/home/stephen/include都是makefile中的变量,因此当您运行“make cg”时,它最终看起来就像我发布的一样。mpif.h存在于/home/stephen/include中,这就是它存在的原因,也是机器上唯一一个名为该文件的文件。此外,所有工作都以非标准方式进行的原因是b/c项目的重点是创建我们自己的MPI版本,允许冗余和高故障率,最终用于BOINC。这些代码我都没有写过,我只是试着编译和运行它(想想是谁写的,我们已经失去了联系)。所以我不认为mpif77能解决我的问题,但无论如何我都会尝试。我刚刚找到了一个重复的mpif.h。所以这段时间我编辑错了@麦克森,你是对的。谢谢@SteVwonder——很乐意帮忙。mpi实现需要编写冗余,这是有道理的——当您有100000个节点时,我确信在一小时内没有节点发生故障的概率会大大降低。祝你好运这些选项绝对不是MPI标准,并且是特定于实现的。-I.和-I/home/stephen/include都是makefile中的变量,所以当您运行“makeCG”时,它看起来就像我发布的一样。mpif.h存在于/home/stephen/include中,这就是它存在的原因,也是机器上唯一一个名为mpif.h的文件