Я пытаюсь скомпилировать приложение pipeline
и свяжите это с моей библиотекой matlabengine
, который действует как оболочка для вызовов Matlab. Matlab использует свою старую версию libstc++
который смешан в папке lib Matlab .../bin/glnxa64
matlabengine
компилируется нормально, но pipeline
терпит неудачу для неразрешенных символов (потому что конвейер использует Matlab’s libstdc++
версия)
В основном у меня есть две проблемы, и решение любой из них должно это исправить:
Убрать аргументы -leng -lmx -L/usr/local/MATLAB/R2013a/bin/glnxa64
от pipeline
ссылки, которые происходят из подкаталога mex
, Когда я компилирую matlabengine
вручную, и пусть cmake свяжет его с конвейером, эти флаги не появляются, и все в порядке. Почему они добавляются в связь с конвейером, когда он прекрасно работает без них?
Поскольку старый libstc ++ от Matlab используется до общесистемного 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 (это должно эмулировать то, что делает оболочка mex-компилятора matlab)
# 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)
Проблема 1 может быть решена с помощью команды cmake отключить транзитивное соединение
MEX / CMakeList.txt
set_target_properties(matlabengine PROPERTIES LINK_INTERFACE_LIBRARIES "")
Затем при связывании компилятор будет искать библиотеку в library path
переменная окружения. Из-за проблемы 2 системная папка стандартной библиотеки должна предшествовать папке библиотеки matlab, как в linux:
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:/usr/local/MATLAB/R2013a/bin/glnxa64/
Других решений пока нет …