我有一个已编译为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库的正确方法是什么?
此错误可能是由此处提供给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