cmake - 使用 cmake 在源文件名之前添加一个编译选项
问题描述
我收到了一个用 Fortran 编写的代码,其中包含使用扩展名 .f95 命名的文件。我知道不推荐使用此扩展名,应仅将 .f 用于固定形式的 Fortran,将 .f90 用于自由形式的 Fortran,但这是我收到代码的方式。
为了编译它,我准备了一些 cmake 文件。当我使用 gfortran 时效果很好,但在使用 Intel Fortran 2021 时效果不佳。似乎 Intel 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
。但是,我没有修改该文件的权限。我尝试在以下内容之后将以下内容添加到我的 CMakeLists.txt 中endif()
:
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()
谢谢你们的建议。
推荐阅读
- python - 如何使用 mTurk API 创建项目?
- python - 为什么当我使用 Python Flask 使用不同的地址时会得到不同的外观?
- swift - 如何同步多个控件?
- c# - 在 Unity 上安装 Firebase 时出现错误“正在卸载损坏的程序集”
- javascript - JS 在 Dropbox 上使用 SQL 选择
- c# - 当 SQL 返回浮点数时,ExecuteScalar 返回双精度
- c# - 为什么 .NET 框架开发人员在展开循环时选择 10(在 x64 12 上)作为因素?
- javascript - 涉及数组和 json javascript 的基本 2d 游戏问题
- matlab - 如何使用ode45在matlab中求解耦合微分方程
- c++ - `~uintptr_t(value)` 方法体是什么意思?C++