使用CMake编译Fortran mex文件

问题描述 投票:1回答:1

我有一个已编译为mex的Fortran项目。它有一堆必须链接在一起的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库的正确方法是什么?

cmake fortran mex
1个回答
0
投票

此错误可能是由此处提供给matlab_add_mex()命令的参数导致的:

matlab_add_mex()

matlab_add_mex( NAME mex_executable SRC mex_executable.F *.f ) 自变量接受源文件的列表,可能无法解析提供的SRC。最好单独列出每个文件:

*.f

或者,您可以使用CMake的matlab_add_mex( NAME mex_executable SRC mex_executable.F file_a.f file_b.f ) 创建GLOB源文件的列表,而改用该列表:

GLOB
© www.soinside.com 2019 - 2024. All rights reserved.