cmake 编译工程具有独特的优势,特别对于复杂的工程更是如此。利用matlab直接编译mex文件时,对于文件数据多的工程时,需要列举所有文件,并且要按照依赖关系排

cmake 编译工程具有独特的优势,特别对于复杂的工程更是如此。利用matlab直接编译mex文件时,对于文件数据多的工程时,需要列举所有文件,,并且要按照依赖关系排序,这些都是直接采用matalb编译mex的缺点。

下面通过一个简单的加法函数例子,说明如何利用cmake编译生成mex文件。如何对系统动态库进行设置,使matlab能够正常调用mex函数。

首先说明如何生成mex文件。

本例首先利用add.h、add.cpp文件编译生成add.so动态文件库,然后利用mian.cpp文件调用add.so库文件实现加法运算。本工程的结构如下图所示:

其中FindMatlab.cmake文件是寻找本机matlab头文件,库文件等相关路径信息的脚本,Matalbdef.def文件是指定函数接口方式采用matlab mex库文件形式,bin文件夹存放工程的mex文件,building文件夹存放camke工程文件。Matalbdef.def和FindMatlab.cmake文件可以在下载。

工程根目录下的CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 2.8)

project(ADD)

set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR})

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) # add FindMatlab module

add_definitions(/DMATLAB_MEX_FILE) #define matlab macros

add_definitions(/DMX_COMPAT_32)

find_package(Matlab REQUIRED)

IF(MATLAB_FOUND)

message(STATUS "MATLAB Found, MATLAB MEX will be compiled.")

add_subdirectory(src)

ELSE(MATLAB_FOUND)

MESSAGE("MATLAB not found...nothing will be built.")

ENDIF(MATLAB_FOUND)

该文件实现对matalb相关路径信息进行配置,CMAKE_INSTALL_PREFIX变量规定了编译完成后,执行make install命令后生成的mex文件转移到什么地方,该变量只是给出一个根目录,具体位置还要看CMakeLists.txt文件中如何写,如本例中给出下面的命令:

install(TARGETS ${CPP_FILE} DESTINATION ./bin)最终mex文件被转移到 ${CMAKE_INSTALL_PREFIX}/bin目录下面。

src文件夹下的CMakeLists.txt文件如下,该文件给出库文件源文件和main文件位置,这两个顺序不能变,mian是依赖与库文件的,要先编译库文件,后编译mian文件。

add_subdirectory(add)

add_subdirectory(main)

add文件夹下的CMakeLists.txt文件如下,由于ubuntu系统下matlab只有动态文件库,所以这里只能生成动态库,这样才能和matlab mex函数进行配合使用。

include_directories(${PROJECT_SOURCE_DIR}/include)

aux_source_directory(. SRC_FILES)

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

add_library(add_lib SHARED ${SRC_FILES})

set_target_properties(add_lib PROPERTIES OUTPUT_NAME "add")

main文件夹下的CMakeLists.txt文件如下,该文件实现将动态库add.so封装到mex文件中的功能。其总include_directories指令要在add_library指令前面,这样才能事先指定mex依赖的库文件位置。最后的install将生成好的mex文件复制到指定位置。

# compile mex file

set(CPP_FILE main)

# set up matlab libraries

set(CPP_FILE_NAME ${CPP_FILE}.cpp)

include_directories(${MATLAB_INCLUDE_DIR} ${PROJECT_SOURCE_DIR}/include)

link_directories(${PROJECT_SOURCE_DIR}/lib)

add_library(${CPP_FILE} SHARED ${CPP_FILE_NAME} ${PROJECT_SOURCE_DIR}/Matlabdef.def)

target_link_libraries(${CPP_FILE} libadd.so ${MATLAB_LIBRARIES})

# 32-bit or 64-bit mex

if(WIN32)

if (CMAKE_CL_64)

set_target_properties(${CPP_FILE} PROPERTIES SUFFIX .mexw64)

else(CMAKE_CL_64)

set_target_properties(${CPP_FILE} PROPERTIES SUFFIX .mexw32)

endif(CMAKE_CL_64)

else(WIN32)

if (CMAKE_SIZEOF_VOID_P MATCHES "8")

set_target_properties(${CPP_FILE} PROPERTIES SUFFIX .mexa64 PREFIX "")

else(CMAKE_SIZEOF_VOID_P MATCHES "8")

set_target_properties(${CPP_FILE} PROPERTIES SUFFIX .mexglx PREFIX "")

endif (CMAKE_SIZEOF_VOID_P MATCHES "8")

endif(WIN32)

# install to /bin by default

install(TARGETS ${CPP_FILE} DESTINATION ./bin)

include文件夹下头文件add.h内容为

float add(float p1,float p2);add文件夹下源文件add.cpp内容为

float add(float p1,float p2)

{

return p1+p2;

}mian文件夹下main.cpp内容为

#include "mex.h"

#include"add.h"

void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )

{

float a;

a=add(3,5);

mexPrintf("Hello World\n");

mexPrintf("%g\n",a);

}

cmake编译之前需要在系统变量中加入MATLAB_ROOT环境变量,该变量会在FindMatlab.cmake文件中使用,使该脚本文件能够找到matlab的头文件和库文件信息,对于本机加入MATLAB_ROOT环境变量语句如下:

export MATLAB_ROOT=/usr/local/MATLAB/R2014b编译的结果如下:

make结果如下,工程中先编译了动态链接库文件libadd.so,ubuntu系统中库文件都会默认有前缀lib,该前缀不能去除,否则系统会出现找不动态链接的情况。

make install结果如下:

至此mex文件便生成完成。

配置系统动态库,matalb调用生成的main.mexa64函数

总的步骤是在系统某个位置保存我们生成的动态库文件和相应的头文件,并将该路径信息以系统变量的形式保存到系统中。下面是详细步骤

cmake重新编译matlab,ubuntu系统下cmake 编译matlab中mex文件相关推荐

  1. linux c++ 调用matlab,ubuntu系统下C++调用matlab程序的方法详解

    前言 最近因为工作的需要在研究C++怎么调用matlab程序,发现网上的资料较少,所以将自己学习的内容总结分享出来,下面话不多说了,来一起看看详细的介绍吧. 实验平台: ubuntu  matlab ...

  2. ubuntu系统下gedit 打开GBK字符集编码文件出现乱码问题解决办法

    使用 Gedit 打开 Windows 系统下编写的文本文件时,文件的中文全是乱码. 有些在Windows下能够打开的txt文件在Ubuntu下用gedit打开时,中文显示是乱码,这是因为编码方式不同 ...

  3. Ubuntu系统下CMake使用教程|1-5

    g++ 是 gnu 的 c++ 编译器,g++编译c++代码流程:预处理->编译->汇编->链接 预处理:展开头文件.宏替换.去掉注释.条件编译. g++ -E test.cpp - ...

  4. c 调用matlab.m文件,ubuntu系统下C++调用matlab程序的方法详解

    前言 最近因为工作的需要在研究C++怎么调用matlab程序,发现网上的资料较少,所以将自己学习的内容总结分享出来,下面话不多说了,来一起看看详细的介绍吧. 实验平台: ubuntu  matlab ...

  5. linux 网卡驱动编译,在linux系统下安装编译网卡驱动的方法

    安装linux操作系统后发现没有网卡驱动,表现为 system → Administration → Network下Hardware列表为空. 以下为安装编译网卡驱动的过程,本人是菜鸟,以下是我从网 ...

  6. 在ubuntu系统下想要移动修改删除文件:提示权限不够的解决方式

    打开一个终端输入: sudo nautilus 然后会跳出一个带有权限的文件管理器(然后就可以有权限地操作了)

  7. usrp运行完整linux,Ubuntu系统下USRP硬件驱动(UHD)的编译与安装

    在Ubuntu系统下USRP硬件驱动(UHD)安装最简单的方式就是直接从Ettus Research官方提供的PPA源安装,不过本文介绍的是如何从源代码进行编译与安装. 1.从PPA源安装只需要下面三 ...

  8. 安卓9.0刷linux,Ubuntu系统下编译Android 9.0系统

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 前言 在Ubuntu系统下编译Android系统.哎呀不知道是不是换了新电脑的缘故,这次编译居然从安装JDK和配置环境下 ...

  9. Ubuntu系统下C语言编译以及Makefile编译C语言程序

    目录 1.c语言hello world 1.打开终端 2.新建文件夹:mkdir 文件名 3.打开文件夹 cd 文件名 4.vim指令打开hello.c的c语言文件:vi hello.c 5.输入以下 ...

最新文章

  1. 信息互通联动防御 亚信安全翻开融合终端安全新篇章
  2. 跳出数据计算拯救人工智能之打败机器学习方法详解
  3. DAY10-万物皆对象-2018-2-2
  4. “Duke选择大奖”荟萃2009最具创新的Java技术应用
  5. 安卓 静态文件读取 staticFile
  6. java自定义jsp标签_Javaweb自定义jsp标签
  7. Android 日夜间切换Demo
  8. 一个销售精英拜访客户的6大绝招,胜过10次培训,实用!
  9. HTML5 学习(1) -- 介绍
  10. mysql - binlog主从复制
  11. matlab离散信号与系统的时域分析
  12. ffmpeg中的pcm格式
  13. 生意参谋活动复盘分析
  14. Echar柱状堆叠图X轴自定义显示功能
  15. IE下载时中文文件名乱码解决
  16. matlab心电信号处理,基于Matlab的心电信号自动处理系统的设计与开发 毕业论文设计.doc...
  17. tomcat环境变量设置
  18. linux多进程的日志记录实现,Linux守护进程的日志实现
  19. jQuery实现对file对象的压缩
  20. 解决webpack中报错的问题

热门文章

  1. linux tcp阻塞socket recv接收数据 未达到指定长度返回问题
  2. linux shell if [[ ]]和[ ]区别 ||
  3. C语言之free函数及野指针
  4. mysql avg 求平均值_使用MySQL中的AVG函数求平均值的教程
  5. 手机1像素线粗_豪威推出4800万像素手机传感器:1/2大底
  6. 单机 搭建kafka集群 本地_单机快速搭建多节点kafka集群
  7. mysql服务器消失_MySQL服务器已经消失了
  8. linux无法创建符号链接 权限不够_Linux 基本命令(看完就会系列)
  9. 筛数方法相关系数_相关系数怎么计算
  10. PLSQL Developer 插入中文 乱码问题,如图 这个是由于oracle服务器端字符编码 和 Oracle 客户端 字符编码不一致引起的。 检查Oracle服务器端字符编码,用 sel