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

0

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

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

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

  1. Удалите аргументы -leng -Lmx -L/usr/local/MATLAB/R2013a/bin/glnxa64 из pipeline связи, которые происходят из подкаталога 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)
Теги:
cmake
matlab-engine

1 ответ

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/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню