【问题标题】:Why does CMake not include Fortran module files of a third party Fortran library?为什么 CMake 不包含第三方 Fortran 库的 Fortran 模块文件?
【发布时间】:2020-03-05 09:00:00
【问题描述】:

我正在尝试使用包含单个外部 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中。

【问题讨论】:

  • include_directories(/usr/local/rad_v2.0.0/include) 将启用.mod 文件的查找。 Makefile 在“构建”处停止(因此需要包含/mod 文件),这应该可以解决。

标签: cmake fortran static-libraries


【解决方案1】:

Pierre de Buyl 的评论为我指出了解决方案。为了包含*.mod 文件,我必须添加以下行:

target_include_directories(myProject PUBLIC "/usr/local/rad_v2.0.0/include")

在致电add_executable() 之后。 此外,我必须在以下调用中链接路径 ${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})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2014-02-17
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多