为什么CMake不包括第三方Fortran库的Fortran模块文件



我正试图用cmake编译一个Fortran源文件main.f90,它包含一个外部Fortran库:

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")

在呼叫CCD_ 13之后。此外,我必须链接路径${RAD}本身,而不是以下调用中的对象RAD

target_link_libraries(myProject ${RAD})

这成功地链接了库。最后,用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})

最新更新