путаница пути ссылки после вызова target_link_libraries

У меня есть проект cmake, где я хочу добавить класс, содержащий движок matlab. Для его компиляции мне нужно включить две библиотеки eng а также mxчто я делаю, добавив

target_link_libraries( ${TARGET} /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so)
target_link_libraries( ${TARGET} /usr/local/MATLAB/R2013b/bin/glnxa64/libmx.so)

к моему CMakeLists.txt файл.
Однако есть также много других старых версий библиотек в /usr/local/MATLAB/R2013b/bin/glnxa64/которые кажутся
автоматически добавляться к пути при вызове вышеуказанной команды. Я думаю, что это заставляет компилятор не найти мой
нормальных библиотек больше и выдает ошибку.
Как я могу включить только две вышеупомянутые библиотеки, а не все остальные в glnxa64 папка?


Предупреждение отображается после запуска cmake . :

CMake Warning at CMakeLists.txt:23 (add_executable):
Cannot generate a safe runtime search path for target CCDWidget because
files in some directories may conflict with libraries in implicit
directories:

runtime library [libboost_program_options.so.1.49.0] in /usr/lib may be hidden by files in:
/usr/local/MATLAB/R2013b/bin/glnxa64
runtime library [libboost_system.so.1.49.0] in /usr/lib may be hidden by files in:
/usr/local/MATLAB/R2013b/bin/glnxa64
runtime library [libboost_filesystem.so.1.49.0] in /usr/lib may be hidden by files in:
/usr/local/MATLAB/R2013b/bin/glnxa64
runtime library [libboost_regex.so.1.49.0] in /usr/lib may be hidden by files in:
/usr/local/MATLAB/R2013b/bin/glnxa64

Some of these libraries may not be found correctly.

И сообщение об ошибке при связывании:

Linking CXX executable CCDWidget
/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined reference to `FT_Face_GetCharVariantIndex'
/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined reference to `FT_Get_Advance'
collect2: error: ld returned 1 exit status
make[2]: ***  [CCDWidget] Error 1
make[1]: *** [CMakeFiles/CCDWidget.dir/all] Error 2
make: *** [all] Error 2

Ниже мой полный CMakeLists.txt файл. Строки, закомментированные с двумя ##, являются альтернативами, которые я пробовал ранее и не решил мою проблему.
Я также добавил LINK_PRIVATE к команде target_link_libraries, как показано в коде ниже, что не имеет значения.
Опция PRIVATE одна версия, кажется, не принята моей версией cmake, так как она изменила сообщение об ошибке на

/usr/bin/ld: cannot find -lPRIVATE
collect2: error: ld returned 1 exit status

Когда #eng строка закомментирована, компиляция и компоновка работает без ошибок
(при вызове движка Matlab также закомментировано в Readout.cpp), поэтому ошибка должна быть вызвана этой строкой.


#Specify the version being used as well as the language
cmake_minimum_required(VERSION 2.6)
##cmake_policy(SET CMP0003 NEW)
#Name your project here
project(CCDWidget)
set(TARGET CCDWidget)

set(MAIN_SOURCES CCDWidget.cpp main.cc CCDControl.cpp VideoWindow.cpp ImageWindow.cpp ThisMeasurement.cpp KineticSeries.cpp FastKinetics.cpp Readout.cpp)

##SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

#set_source_files_properties(Readout.cpp PROPERTIES COMPILE_FLAGS "-I/usr/local/MATLAB/R2013b/extern/include -I/usr/local/MATLAB/R2013b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -I/usr/local/MATLAB/R2013b/extern/include/cpp -I/usr/local/MATLAB/R2013b/extern/include -DGLNXA64 -DGCC  -DMX_COMPAT_32 -DNDEBUG -Wno-effc++")

find_package(Boost COMPONENTS program_options system filesystem regex REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GTKMM gtkmm-3.0)

include_directories( ${GTKMM_INCLUDE_DIRS} )
include_directories( ${Boost_INCLUDE_DIR} )
include_directories( ${PROJECT_SOURCE_DIR} )
##link_directories(/usr/local/MATLAB/R2013b/bin/glnxa64)
##target_link_libraries( ${TARGET} eng)
##target_link_libraries( ${TARGET} mx)

set(CMAKE_CXX_FLAGS "--std=c++11")
add_executable( ${TARGET} ${MAIN_SOURCES} )

target_link_libraries( ${TARGET} ${GTKMM_LIBRARIES} )
target_link_libraries( ${TARGET} ${Boost_LIBRARIES} )
target_link_libraries( ${TARGET} LINK_PRIVATE /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so)  # eng
#target_link_libraries( ${TARGET} LINK_PRIVATE /usr/local/MATLAB/R2013b/bin/glnxa64/libmx.so ) # mx
target_link_libraries( ${TARGET} andor )

2

Решение

Вы можете попробовать использовать импортированная цель:

add_library(eng SHARED IMPORTED)
set_property(TARGET eng PROPERTY IMPORTED_LOCATION /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so)
...
add_executable( ${TARGET} ${MAIN_SOURCES} )
...
target_link_libraries(${TARGET} eng)

Для отладки вы можете попробовать собратьсделать VERBOSE = 1».
Это покажет вам используемую командную строку gcc.
CMake, вероятно, преобразует ваш target_link_libraries команда что-то вроде:

g++ ... -L/usr/local/MATLAB/R2013b/bin/glnxa64 -leng ...

Затем gcc находит в этой папке несколько библиотек надстроек.

1

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


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