cmake добавляет флаги, библиотеки из подкаталога, которые портят приоритет ссылок / библиотек

Я пытаюсь скомпилировать приложение pipeline и свяжите это с моей библиотекой matlabengine, который действует как оболочка для вызовов Matlab. Matlab использует свою старую версию libstc++ который смешан в папке lib Matlab .../bin/glnxa64

matlabengine компилируется нормально, но pipeline терпит неудачу для неразрешенных символов (потому что конвейер использует Matlab’s libstdc++ версия)

В основном у меня есть две проблемы, и решение любой из них должно это исправить:

  1. Убрать аргументы -leng -lmx -L/usr/local/MATLAB/R2013a/bin/glnxa64 от pipeline ссылки, которые происходят из подкаталога mex, Когда я компилирую matlabengine вручную, и пусть cmake свяжет его с конвейером, эти флаги не появляются, и все в порядке. Почему они добавляются в связь с конвейером, когда он прекрасно работает без них?

  2. Поскольку старый 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)

0

Решение

Проблема 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/
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]