2014-11-28 3 views
2

Я работаю на сервере без привилегий 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. Любая помощь приветствуется!

+0

вы проверяете ли '' Boost_REALPATH' и Boost_DEBUG' в [документации] (http://www.cmake.org/cmake/help/v2.8.12/cmake.html#module:FindBoost)? –

+0

Спасибо, установка Boost_REALPATH на ON, похоже, исправить. Я не уверен, что полностью понимаю, почему это не поведение по умолчанию. Не могли бы вы добавить ответ, тогда я приму это. – Patrick

+0

На самом деле я добавил его в качестве ответа, затем я увидел предложение «Это не влияет на связь и не должно быть включено, если пользователю не нужна эта информация», и удалил его. Теперь я смущен. –

ответ

0

Я считаю, что это объясняется в documentation: set(Boost_REALPATH ON).

Boost_REALPATH - установить в положение ON, чтобы разрешить символические ссылки для обнаруженных библиотек для оказания помощи при упаковке. Например, библиотека компонентов «системы» может быть разрешена до «/usr/lib/libboost_system.so.1.42.0» вместо «/usr/lib/libboost_system.so». Это не влияет на связь и не должно быть включено, если пользователю эта информация.

+0

Спасибо, это исправило мою проблему, хотя я не понимаю, почему, особенно учитывая последнее предложение (см. Комментарии выше): «Это не влияет на привязку и не должно быть включено, если пользователю не нужна эта информация». – Patrick

Смежные вопросы