为什么 CMake 不包含第三方 Fortran 库的 Fortran 模块文件?
Why does CMake not include Fortran module files of a third party Fortran library?
我正在尝试使用包含单个外部 Fortran 库的 cmake 编译单个 Fortran 源文件 main.f90
:
USE RAD_Module
使用以下简单的手写 makefile 可以很好地编译该项目:
all:
gfortran -c -I/usr/local/rad_v2.0.0/include main.f90
gfortran -L/usr/local/rad_v2.0.0/lib -lRAD -o test.out main.o
外部静态库没有CMakeLists.txt
,其结构如下:
- 它的
*.mod
模块文件位于 /usr/local/rad_v2.0.0/include/
.
- 它的
librad.a
文件位于 /usr/local/rad_v2.0.0/lib/
.
我的 CMakeLists.txt
文件如下所示:
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
project("myProject" Fortran)
enable_language(Fortran)
## Target from sources:
add_executable(myProject main.f90)
## Link library:
link_directories("/usr/local/rad_v2.0.0/lib")
link_directories("/usr/local/rad_v2.0.0/include")
find_library(RAD
NAMES librad.a
HINTS "/usr/local/rad_v2.0.0/lib")
if(NOT RAD)
message(FATAL_ERROR "RAD library not found!")
endif()
target_link_libraries(myProject RAD)
有了这个 CMakeLists.txt
cmake 成功生成了一个 makefile。但是,当我随后尝试 make
代码时,我收到以下错误消息:
15 | USE RAD_Module
| 1
Fatal Error: Cannot open module file 'rad_module.mod' for reading at (1): No such file or directory
compilation terminated.
文件 rad_module.mod
位于文件夹 /usr/local/rad_v2.0.0/include
。
Pierre de Buyl 的评论为我指出了解决方案。为了包含 *.mod
文件,我必须添加以下行:
target_include_directories(myProject PUBLIC "/usr/local/rad_v2.0.0/include")
调用后 add_executable()
。
此外,我必须 link 路径 ${RAD}
本身,而不是以下调用中的对象 RAD
:
target_link_libraries(myProject ${RAD})
这已成功 link 图书馆。
最后,link 使用 link_directories()
对库目录没有影响,我完全删除了相应的行。
工作 CMakeLists.txt
看起来像这样:
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
project("myProject" Fortran)
enable_language(Fortran)
## Target from sources:
add_executable(myProject main.f90)
## Link library:
find_library(RAD
NAMES librad.a
HINTS "/usr/local/rad_v2.0.0/lib")
if(NOT RAD)
message(FATAL_ERROR "RAD library not found!")
endif()
target_include_directories(myProject PUBLIC "/usr/local/rad_v2.0.0/include")
target_link_libraries(myProject ${RAD})
我正在尝试使用包含单个外部 Fortran 库的 cmake 编译单个 Fortran 源文件 main.f90
:
USE RAD_Module
使用以下简单的手写 makefile 可以很好地编译该项目:
all:
gfortran -c -I/usr/local/rad_v2.0.0/include main.f90
gfortran -L/usr/local/rad_v2.0.0/lib -lRAD -o test.out main.o
外部静态库没有CMakeLists.txt
,其结构如下:
- 它的
*.mod
模块文件位于/usr/local/rad_v2.0.0/include/
. - 它的
librad.a
文件位于/usr/local/rad_v2.0.0/lib/
.
我的 CMakeLists.txt
文件如下所示:
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
project("myProject" Fortran)
enable_language(Fortran)
## Target from sources:
add_executable(myProject main.f90)
## Link library:
link_directories("/usr/local/rad_v2.0.0/lib")
link_directories("/usr/local/rad_v2.0.0/include")
find_library(RAD
NAMES librad.a
HINTS "/usr/local/rad_v2.0.0/lib")
if(NOT RAD)
message(FATAL_ERROR "RAD library not found!")
endif()
target_link_libraries(myProject RAD)
有了这个 CMakeLists.txt
cmake 成功生成了一个 makefile。但是,当我随后尝试 make
代码时,我收到以下错误消息:
15 | USE RAD_Module
| 1
Fatal Error: Cannot open module file 'rad_module.mod' for reading at (1): No such file or directory
compilation terminated.
文件 rad_module.mod
位于文件夹 /usr/local/rad_v2.0.0/include
。
Pierre de Buyl 的评论为我指出了解决方案。为了包含 *.mod
文件,我必须添加以下行:
target_include_directories(myProject PUBLIC "/usr/local/rad_v2.0.0/include")
调用后 add_executable()
。
此外,我必须 link 路径 ${RAD}
本身,而不是以下调用中的对象 RAD
:
target_link_libraries(myProject ${RAD})
这已成功 link 图书馆。
最后,link 使用 link_directories()
对库目录没有影响,我完全删除了相应的行。
工作 CMakeLists.txt
看起来像这样:
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
project("myProject" Fortran)
enable_language(Fortran)
## Target from sources:
add_executable(myProject main.f90)
## Link library:
find_library(RAD
NAMES librad.a
HINTS "/usr/local/rad_v2.0.0/lib")
if(NOT RAD)
message(FATAL_ERROR "RAD library not found!")
endif()
target_include_directories(myProject PUBLIC "/usr/local/rad_v2.0.0/include")
target_link_libraries(myProject ${RAD})