GNU Fortran / 预处理器问题与宏和双正斜杠
GNU Fortran / Preprocessor issue with macros and double forward slash
我最近将我的 gnu 编译器从 4.8.4(在 Ubuntu 14.04)升级到 5.4(Ubuntu 16.04),现在我使用的一个包不再编译。它适用于 gnu 4.8.4。
首先,编译在我的 makefile 中的这一行停止:
cpp -std=c89 -C $(FLAGS) $(PARSER_INC) $(COMMON)/struct_parser.F90 > $(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 中的下一行会产生一整套错误:
$(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 兼容,必须在 traditional-mode
中调用 cpp
,gfortran 会自动为您调用。只需对 .F
和 .F90
文件执行 gfortran -cpp
甚至 gfortran
。
如果你使用像可变宏这样的高级宏,你可能就不走运了,这里的提问者 最终坚持使用旧的 GCC 版本。
我最近将我的 gnu 编译器从 4.8.4(在 Ubuntu 14.04)升级到 5.4(Ubuntu 16.04),现在我使用的一个包不再编译。它适用于 gnu 4.8.4。
首先,编译在我的 makefile 中的这一行停止:
cpp -std=c89 -C $(FLAGS) $(PARSER_INC) $(COMMON)/struct_parser.F90 > $(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 中的下一行会产生一整套错误:
$(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 兼容,必须在 traditional-mode
中调用 cpp
,gfortran 会自动为您调用。只需对 .F
和 .F90
文件执行 gfortran -cpp
甚至 gfortran
。
如果你使用像可变宏这样的高级宏,你可能就不走运了,这里的提问者