我最近将我的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
似乎问题是用-std = c89调用了cpp,它有双正斜杠的问题(即使这是一个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'顺便说一句,宏是定义的。
答案 0 :(得分:3)
不要直接通过cpp
使用预处理器。它是C预处理器,而不是Fortran预处理器。它没有正确处理Fortran(即//
)。
要与Fortran兼容,必须在cpp
中调用traditional-mode
,gfortran会自动为您执行此操作。对于gfortran -cpp
和gfortran
文件,只需.F
甚至.F90
。
如果你使用像变量宏这样的高级宏内容,你可能会运气不好,这里的提问者CPP/GPP in Fortran variadic macro (plus Fortran // concatenation)最终坚持使用旧的GCC版本。