Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile GNU Fortran/预处理器宏和双正斜杠问题_Makefile_Fortran_C Preprocessor_Gnu_Gfortran - Fatal编程技术网

Makefile GNU Fortran/预处理器宏和双正斜杠问题

Makefile GNU Fortran/预处理器宏和双正斜杠问题,makefile,fortran,c-preprocessor,gnu,gfortran,Makefile,Fortran,C Preprocessor,Gnu,Gfortran,我最近将我的gnu编译器从4.8.4(在Ubuntu 14.04上)升级到5.4(Ubuntu 16.04),现在我使用的一个包不再编译。它在GNU4.8.4中运行良好 首先,编译在我的makefile中的这一行停止: cpp -std=c89 -C $(FLAGS) $(PARSER_INC) $(COMMON)/struct_parser.F90 > $(PARSER_NAME).F90 $(F90) -o $@ -c -nocpp $(FFLAGS) $(INC) -I$(COMM

我最近将我的gnu编译器从4.8.4(在Ubuntu 14.04上)升级到5.4(Ubuntu 16.04),现在我使用的一个包不再编译。它在GNU4.8.4中运行良好

首先,编译在我的makefile中的这一行停止:

cpp -std=c89 -C $(FLAGS) $(PARSER_INC) $(COMMON)/struct_parser.F90 > $(PARSER_NAME).F90
$(F90) -o $@ -c -nocpp $(FFLAGS) $(INC) -I$(COMMON)/obj $(AUXFLAGS) $(PARSER_NAME).F90
错误是:

../common/struct_parser.F90:53:31: error: C++ style comments are not allowed in ISO C90
    c_filename = trim(filename)//C_NULL_CHAR
问题似乎在于cpp是用-std=c89调用的,这与双正斜杠有关(尽管这是fortran级联,而不是C代码的一部分)。 克服这个错误的最佳方法是什么?如果我删除-std=c89,那么编译将继续进行,但我不认为这是一个好的解决方案。 如果我删除了std行,那么我会从makefile中的下一行生成一整套错误:

cpp -std=c89 -C $(FLAGS) $(PARSER_INC) $(COMMON)/struct_parser.F90 > $(PARSER_NAME).F90
$(F90) -o $@ -c -nocpp $(FFLAGS) $(INC) -I$(COMMON)/obj $(AUXFLAGS) $(PARSER_NAME).F90
所有错误如下所示,仅针对F90文件的不同行:

count = count + print_bool_scalar(ptr, max(0, length - count), XSTR(COMMON_FILE_FLAGS_T_VARIABLE)//'%'//XSTR(do_cloud)//C_NULL_CHAR, COMMON_FILE_FLAGS_T_VARIABLE%do_cloud)
                                                                                                                                                                    1
Error: Symbol ‘common_file_flags_t_variable’ at (1) has no IMPLICIT type
/media/data/Software/ORAC/trunk/obj/read_ctrl.f_pri.inc:4:172:
相关环境变量:

F90 = gfortran
FFLAGS=-O3 -g -cpp -ffree-line-length-0 -fopenmp

知道那里发生了什么吗?我想这与我在cpp上犯的第一个错误有关。顺便说一下,“XSTR”宏是定义的。

不要通过
cpp
直接使用预处理器。它是一个C预处理器,而不是Fortran预处理器。它不能正确处理Fortran(即
/

要与Fortran兼容,必须在传统模式下调用
cpp
,gfortran会自动为您调用该模式。只需对
.F
.F90
文件执行
gfortran-cpp
或甚至只执行
gfortran


如果你使用高级宏,比如可变宏,你可能运气不好,这里的询问者最终还是坚持使用旧的GCC版本。

谢谢,我真的不知道可变宏是什么,但很明显GNU5编译器在这类问题上是坏的。我再次降级到GNU4,一切正常。我发现GNU的编剧们弄坏了这样的东西,这让我非常失望。他们可能会长期转投英特尔。他们“破坏”了原本不应该以任何特定方式工作的东西。它是一个C预处理器,是为C而不是为Fortran开发的。如果你把它用于Fortran,你就只能靠自己了,任何事情都有可能发生。