2014-02-14 53 views
0

我試圖編譯應用程序pipeline並鏈接它與我的庫matlabengine,它充當包裝到Matlab調用。 Matlab的使用它自己這是在Matlab的lib文件夾混合libstc++舊版本.../bin/glnxa64cmake添加標誌,從子目錄庫,破壞鏈接/庫鏈接優先

matlabengine編譯好的,但pipeline失敗未解決的符號(由於管道使用Matlab的libstdc++版)

基本上我有兩個問題,解決或者一個應該解決這個問題:

  1. 刪除參數-leng -lmx -L/usr/local/MATLAB/R2013a/bin/glnxa64pipeline連接,從子目錄mex其起源。當我手工編譯matlabengine並讓cmake鏈接到管道時,這些標誌不會出現,並且一切正常。爲什麼這些添加到管道的鏈接時,如果沒有它們完美的工作?

  2. 由於Matlab的舊libstC++在系統範圍的libstdC++之前使用,我得到了未解析的符號。修復命令C++搜索這些庫也應該解決這個問題。

任何幫助深表感謝......

CMakeList.txt

link_directories("/usr/local/MATLAB/R2013a}/bin/glnxa64") 
include_directories(mex) 
add_subdirectory(mex) 
ADD_EXECUTABLE(pipeline pipeline.cpp) 
TARGET_LINK_LIBRARIES(pipeline matlabengine ${OpenCV_LIBS}) 

MEX/CMakeList.txt(這應該效仿MATLAB的MEX編譯器封裝器)

# mex specific c++ flags 
set(MATLAB_PATH "/usr/local/MATLAB/R2013a") 
set(CMAKE_CXX_COMPILER "gcc-4.4") 
set(CMAKE_CXX_FLAGS "-D_GNU_SOURCE -fexceptions -DMX_COMPAT_32 -O -DNDEBUG -fPIC -DMATLAB_MEX_FILE") 

include_directories("${MATLAB_PATH}/extern/include") 
link_directories("${MATLAB_PATH}/bin/glnxa64") 
add_library(matlabengine SHARED matlabengine.cpp) 
target_link_libraries(matlabengine eng mx m) 

回答

0

問題1可以通過告訴cmake關閉傳遞鏈接來解決

MEX/CMakeList.txt

set_target_properties(matlabengine PROPERTIES LINK_INTERFACE_LIBRARIES "") 

然後,鏈接編譯器將搜索在library path環境變量的庫時。由於問題2,系統標準庫文件夾應該像linux一樣位於matlab庫文件夾之前:

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:/usr/local/MATLAB/R2013a/bin/glnxa64/