Почему CMake не включает файлы модулей Fortran сторонней библиотеки Fortran? - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь скомпилировать один исходный файл Фортрана main.f90 с помощью cmake, который включает в себя одну внешнюю библиотеку Фортрана:

USE RAD_Module

Проект прекрасно компилируется с помощью следующего простого рукописного файла сборки:

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

Внешняя библиотека stati c не имеет 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 успешно создает make-файл. Однако, когда я впоследствии пытаюсь 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.

1 Ответ

0 голосов
/ 05 марта 2020

Комментарий Пьера де Бюля указал мне на решение. Чтобы включить файлы *.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})
...