Я работаю на сервере без привилегий root. У меня есть простое приложение командной строки, которое ссылается на OpenCV и Boost, и я использую cmake 2.8.12. В/usr/lib64 есть старые библиотеки boost, но я хочу использовать более новые библиотеки boost, которые я могу загрузить с помощью модуля среды. Файл CMakeLists.txt заключается в следующем:CMake, каталоги ссылок и несколько установок Boost
cmake_minimum_required(VERSION 2.8.12)
find_package(Boost 1.55.0 REQUIRED COMPONENTS program_options system thread)
find_package(OpenCV REQUIRED)
message("Boost dirs: ${Boost_LIBRARY_DIRS} ${Boost_INCLUDE_DIRS}")
message("Boost libraries ${Boost_LIBRARIES}")
include_directories(${OpenCV_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${Boost_LIBRARY_DIRS}")
add_executable(tile_images src/tile_images.cpp)
target_link_libraries(tile_images ${OpenCV_LIBRARIES} ${Boost_LIBRARIES})
Сообщения печати полные пути к соответствующим библиотекам:
Повышения каталоги: /cm/shared/apps/boost/1.56/lib /см/общие/приложения/усиление/1,56/включить
Повысьте эффективность библиотек /cm/shared/apps/boost/1.56/lib/libboost_program_options.so;/cm/shared/apps/boost/1.56/lib/libboost_system. so; /cm/shared/apps/boost/1.56/lib/libboost_thread.so
Проблема возникает при компоновке, CMake генерирует следующий вызов C++:
/USR/бен/C++ CMakeFiles/tile_images.dir/SRC/tile_images.cpp.o -o tile_images -rdynamic/cm/shared/apps/opencv/2.4.9/lib/libopencv_videostab.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_video.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_ts.a /cm/shared/apps/opencv/2.4.9/lib/libopencv_superres.so.2.4.9 /cm/shared/apps/opencv/2.4.9/ lib/libopencv_stitching.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_photo.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_ocl.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_objdetect.so.2.4.9 /см/shared/apps/opencv/2.4.9/lib/libopencv_nonfree.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_ml.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_legacy.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_imgproc.so.2.4.9 /cm/shared/apps/opencv/2.4. 9/lib/libopencv_highgui.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_gpu.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/ libopencv_flann.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_features2d.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_core.so. 2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_contrib.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_calib3d.so.2.4.9 -lboost_program_options - lboost_system -lboost_thread -ldl -lm -lpthread -lrt /cm/shared/apps/opencv/2.4.9/lib/libopencv_nonfree.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_ocl .so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_gpu.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_photo.so.2.4 .9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_objdetect.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_legacy.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_video.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_ml.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_calib3d.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_features2d.so.2.4.9 /см/shared/apps/opencv/2.4.9/lib/libopencv_highgui.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_imgproc.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_flann.so.2.4.9 /cm/shared/apps/opencv/2.4.9/lib/libopencv_core.so.2.4.9
Обратите внимание, что абсолютный путь к библиотекам ускорения был удален и не включен с использованием флага -L. Затем я получаю следующее предупреждение, намекая на то, что линкер собирание другой, более старую установку наддува в/USR/lib64
/USR/BIN/LD: предупреждение: libboost_system.so.1.56.0 , необходимо /cm/shared/apps/boost/1.56/lib/libboost_thread.so, может конфликтовать с libboost_system.so.5
Образцы затем выдает длинный список ошибок, вероятно, потому что старый Используются библиотеки Boost, но код построен с новыми заголовками Boost.
Если добавить следующее в CMakeLists.txt:
набор (CMAKE_CXX_FLAGS "$ {CMAKE_CXX_FLAGS} -L $ {Boost_LIBRARY_DIRS}")
затем код ссылки без проблем. Я потратил некоторое время на исследование, но до сих пор я нарисовал пробел о том, как заставить CMake включить флаг -L или как остановить его удаление абсолютных путей из библиотек boost. Любая помощь приветствуется!
вы проверяете ли '' Boost_REALPATH' и Boost_DEBUG' в [документации] (http://www.cmake.org/cmake/help/v2.8.12/cmake.html#module:FindBoost)? –
Спасибо, установка Boost_REALPATH на ON, похоже, исправить. Я не уверен, что полностью понимаю, почему это не поведение по умолчанию. Не могли бы вы добавить ответ, тогда я приму это. – Patrick
На самом деле я добавил его в качестве ответа, затем я увидел предложение «Это не влияет на связь и не должно быть включено, если пользователю не нужна эта информация», и удалил его. Теперь я смущен. –