Компиляция морт-файла Fortran с помощью CMake - PullRequest
1 голос
/ 01 апреля 2020

У меня есть проект на Fortran, который я собрал в mex. Он содержит несколько файлов Fortran, которые должны быть связаны друг с другом, и несколько mex-библиотек. Используя Makefile, подобный приведенному ниже, я смог заставить его работать:

MEX=/opt/matlab/r2018a/bin/mex

FORTRAN = gfortran
FFLAGS = -c -fpic -fopenmp -Wall -O3 -fdefault-real-8 -fdefault-double-8
MEXLIBDIR = /opt/matlab/r2018a/sys/os/glnxa64
MEXLIB = -lgfortran -liomp5 -lirc -lsvml -limf 

OBJS=\
file_a.o\
file_b.o\

all: file_a file_b mex

mex: mex_executable.F $(OBJS) 
    $(MEX) -v -O mex_exectuable.F $(OBJS) -L$(MEXLIBDIR) $(MEXLIB)

file_a: file_a.f
    $(FORTRAN) $(FFLAGS) file_a.f

file_b: file_b.f
    $(FORTRAN) $(FFLAGS) file_b.f

Поскольку у меня будет несколько таких проектов, я бы хотел поместить все в один файл CMake.

Пока у меня есть CMakeLists.txt, который выглядит примерно так, внутри каталога сборки:

cmake_minimum_required(VERSION 2.8)
project(MEX)

enable_language(Fortran)

find_package(Matlab REQUIRED MAIN_PROGRAM MX_LIBRARY)    
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin/")

# Assuming gfortran
set(CMAKE_Fortran_FLAGS "-c -fpic -Wall -O3  -fopenmp -fdefault-real-8 -fdefault-double-8")

include_directories(
  ${Matlab_INCLUDE_DIRS}
)

# Add modules with MEX to be built
add_subdirectory("${PROJECT_SOURCE_DIR}/Project1")

А внутри каталога Project1 у меня есть еще один CMakeLists.txt:

include_directories(
  ${CMAKE_CURRENT_SOURCE_DIR}
)

## MEX functions
matlab_add_mex(
    NAME mex_executable
    SRC mex_executable.F *.f
)
target_link_libraries(mex_executable lgfortran liomp5 lirc lsvml limf )

Когда я запускаю CMake, я получаю сообщение об ошибке:

Cannot find source file:

    *.f

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx

Как правильно указать CMake для компиляции файлов Fortran и связывания правильных библиотек mex?

1 Ответ

1 голос
/ 01 апреля 2020

Эта ошибка, вероятно, является результатом аргументов, предоставленных здесь для команды matlab_add_mex():

matlab_add_mex(
    NAME mex_executable
    SRC mex_executable.F *.f
)

Аргумент SRC принимает список источника файлы, и, вероятно, не может разрешить *.f. Лучше всего перечислить каждый файл по отдельности:

matlab_add_mex(
    NAME mex_executable
    SRC mex_executable.F file_a.f file_b.f
)

Или вы можете использовать CMake GLOB для создания списка .f исходных файлов и использовать этот список вместо :

file(GLOB FORTRAN_SRCS_LIST *.f)
matlab_add_mex(
    NAME mex_executable
    SRC mex_executable.F ${FORTRAN_SRCS_LIST}
)
...