Linux下C++,matlab混合编程

来源:互联网 发布:arp 添加网关mac 编辑:程序博客网 时间:2024/06/11 17:24

C++调用matlab生成的动态库文件,再生成新的动态库文件

使用python调用C++调用matlab生成的动态库文件

调用过程:

(1). 设定编译器为gcc,在matlab 命令行依次执行命令mex -setup和mbuild -setup.
(2). 编写matlab脚本
(3). 生成动态库文件。 mcc -W cpplib:libmyFunc -T link:lib myFunc.m -C
(4). 安装MCRInstaller

sudo gedit /etc/profileexport LD_LIBRARY_PATH=matlabroot/matlab_compiler/v91/runtime/glnxa64:matlabroot/matlab_compiler/v91/bin/glnxa64:matlabroot/matlab_compiler/v91/sys/os/glnxa64:$LD_LIBRARY_PATHsudo source /etc/profile

(5). 配置环境

sudo gedit /etc/ld.so.confmatlabroot/matlab_compiler/v91/runtime/glnxa64matlabroot/matlab_compiler/v91/bin/glnxa64 sudo ldconfig 

(6).C++调用matlab生成的动态库文件生成新的动态库文件CMakeLists.txt

macro (add_sources)    file (RELATIVE_PATH _relPath "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")    foreach (_src ${ARGN})        if (_relPath)            list (APPEND SRCS "${_relPath}/${_src}")        else()            list (APPEND SRCS "${_src}")        endif()    endforeach()    if (_relPath) # propagate SRCS to parent directory        set (SRCS ${SRCS} PARENT_SCOPE)    endif()endmacro()project(MATLABTest)cmake_minimum_required(VERSION 2.8.4)find_package(OpenCV REQUIRED)SET(ENV{Configuration} Release) include_directories(${OPENCV_INCLUDE_DIRS} /matlab/bin/test/ /matlab/matlab_compiler/v91/extern/include/)LINK_DIRECTORIES(/matlab/matlab_compiler/v91/bin/glnxa64/ )add_subdirectory(src)add_executable(main ${SRCS})#ADD_LIBRARY(main SHARED ${SRCS})target_link_libraries(main ${OpenCV_LIBS} /matlab/bin/test/libmyFunc.so /matlab/matlab_compiler/v91/runtime/glnxa64/libmwmclmcrrt.so.9.1 /matlab/matlab_compiler/v91/bin/glnxa64/libmwmclmcr.so)

(7).python调用新生成的动态库文件

使用过程中遇到的问题:

(1).python调用新生成的动态库时出现libssl.so.1.0.0: Undefined symbol “EVP_idea_cbc”。这个问题可能是import cv2 ,import libmyFunc顺序不对所致。正确顺序为import libmyFunc,import cv2 。

(2).python调用新生成的动态库时C++调用matlab动态库时初始化失败。这个问题可能是matlab使用mcc编译动态库时命令选项错误导致,再网上大部分是因为编译选项mcc -W cpplib:libmyFunc -T link:lib myFunc.m -C生成的.ctf没有拷贝到当前目录造成的。而我的matlab 是9.1版本,使用上述方法无效。最终是将-C去掉编译后解决的。

(3).关于C++调用matlab接口传递opencv的Mat类型数据以及matlab返回数组转Mat可以参考[4].注:这种数据转换方式效率很差,想提高效率可以改写其中的图片数据遍历方式或拆分图像通道传递等方式。

参考:

[1].http://blog.csdn.net/arackethis/article/details/43372553
[2].http://blog.csdn.net/arackethis/article/details/43374849
[3].http://blog.csdn.net/arackethis/article/details/43375943
[4].http://www.cnblogs.com/yingying0907/archive/2012/10/13/2722688.html

0 0
原创粉丝点击