我收到了一段用Fortran编写的代码,其中的文件名为.f95。我知道不建议使用此扩展,只应将.f用于固定形式Fortran,将.f90用于自由形式Fortran,但这是我接收代码的方式。
为了编译它,我准备了一些cmake文件。当我使用gfortran时,它工作得很好,但当我使用"英特尔Fortran 2021"时,它不工作。"英特尔Fortran"似乎默认不接受.f95扩展。
例如,以下内容不起作用:
ifort mySrc.f95 -c
但是可以通过键入来强制ifort接受这个.f95扩展名
ifort -free -Tf mySrc.f95 -c
这是我为项目准备的一个简化的CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project (Test VERSION 1.0
DESCRIPTION "CMAKE files to compile test"
LANGUAGES Fortran)
if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
if(CMAKE_Fortran_COMPILER_VERSION VERSION_LESS "20")
message(FATAL_ERROR "Intel Fortran Compiler 20 or newer required")
endif()
set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -warn all")
set (CMAKE_Fortran_FLAGS_RELEASE "-O2")
set (CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g")
set (CMAKE_Fortran_FLAGS_DEBUG "-g")
endif()
file(GLOB FILES_SRC CONFIGURE_DEPENDS "*.f95")
set(LIB_MOD_DIR ${CMAKE_CURRENT_BINARY_DIR}/mod/)
add_executable(MYCODE ${FILES_SRC})
set_target_properties(MYCODE
PROPERTIES Fortran_MODULE_DIRECTORY ${LIB_MOD_DIR})
set_property(TARGET MYCODE PROPERTY LINKER_LANGUAGE Fortran)
install(TARGETS MYCODE
RUNTIME DESTINATION bin
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
)
install(DIRECTORY ${LIB_MOD_DIR} DESTINATION include)
我正试图将这些-free和-Tf选项添加到我的cmake脚本中,但这些选项必须位于要编译的文件的文件名之前。我找到了这个链接,他们提到这可以通过我修改文件/Modules/Platform/Linux-Intel-Fortran.cmake
来实现。但是,我没有修改该文件的权限。我尝试在endif()
:之后将以下内容添加到我的CMakeLists.txt中
SET(CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> -o <OBJECT> <DEFINES> <FLAGS> -c -Tf <SOURCE>")
但我总是犯错误。是否可以使用CMakeLists.txt文件实现此功能?提前谢谢。
当我在CMakeLists.txt文件中添加以下选项时:
SET(CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> -o <OBJECT> <DEFINES> <FLAGS> -c -Tf <SOURCE>")
我忘记添加-free
来表示文件是自由格式的。默认情况下,-Tf
会将文件视为固定形式的Fortran。这就是编译失败的原因。因此,使用CMAKE_Fortran_COMPILE_OBJECT
是使ifort接受f95
文件的正确方法。
所以现在我可以将cmake与ifort和f95
文件一起使用了。"英特尔Fortran"的CMakeLists.txt部分如下:
if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
if(CMAKE_Fortran_COMPILER_VERSION VERSION_LESS "20")
message(FATAL_ERROR "Intel Fortran Compiler 20 or newer required")
endif()
set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -warn all")
set (CMAKE_Fortran_FLAGS_RELEASE "-O2")
set (CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g")
set (CMAKE_Fortran_FLAGS_DEBUG "-g")
set (CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> -o <OBJECT> <DEFINES> <FLAGS> -c -free -Tf <SOURCE>")
endif()
谢谢你们两个的建议。