我正在使用Emacs编写Fortran代码,使用Nakeja生成器编写CMake。如果我使用make
作为生成器而不是Ninja,并且存在编码错误,则会收到类似
/home/raul/Projects/test/main.f90:54:9:
my_cols = 1
1
Error: Symbol ‘my_cols’ at (1) has no IMPLICIT type
Emacs报告源文件的正确位置以及行号和列号,以便我可以快速跳转到有问题的代码。另一方面,使用Ninja,返回的错误消息如下所示:
CMakeFiles/run.dir/main.f90-pp.f90:54:9:
1
Error: Symbol ‘my_cols’ at (1) has no IMPLICIT type
我指出看起来像预处理的Fortran源文件,而不是原始源文件。行号和列号对应于原始文件,错误消息的内容略有不同(“1”以上的行已丢失)。这显然很烦人,因为我需要在原始文件中进行任何修复,而不是预处理的文件。有没有办法改变这种行为?我不确定这是否与Emacs,Ninja,Cmake或Fortran有关。
编辑。最小的例子。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(test Fortran)
add_executable(main main.f90)
# main.f90
implicit none
a = 5
end program
有了gfortran,我得到了
[3/4] Building Fortran object CMakeFiles/main.dir/main.f90.o
FAILED: CMakeFiles/main.dir/main.f90.o
/usr/bin/f95 -I../ -c CMakeFiles/main.dir/main.f90-pp.f90 -o CMakeFiles/main.dir/main.f90.o
CMakeFiles/main.dir/main.f90-pp.f90:2:3:
# 1 "<built-in>"
1
Error: Symbol ‘a’ at (1) has no IMPLICIT type
ninja: build stopped: subcommand failed.
有趣的是,使用英特尔Fortran编译器(ifort),我得到了
[3/4] Building Fortran object CMakeFiles/main.dir/main.f90.o
FAILED: CMakeFiles/main.dir/main.f90.o
/opt/intel/compilers_and_libraries_2017.4.196/linux/bin/intel64/ifort -I../ -c CMakeFiles/main.dir/main.f90-pp.f90 -o CMakeFiles/main.dir/main.f90.o
../main.f90(2): error #6404: This name does not have a type, and must have an explicit type. [A]
a = 5
--^
compilation aborted for CMakeFiles/main.dir/main.f90-pp.f90 (code 1)
ninja: build stopped: subcommand failed.
错误消息略有不同,现在它可以指向正确的位置。 (在一个包含多个子目录的更复杂的项目中,ifort也会出错。)