我在一个没有根权限的服务器上工作。我有一个简单的命令行应用程序,它链接到OpenCV和Boost,我使用的是cmake2.8.12。在/usr/lib64 64中有旧的boost库,但是我希望使用更新的boost库,可以使用环境模块加载这些库。CMakeLists.txt文件如下:
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} )
这些消息打印正确库的完整路径:
Boost dirs: /cm/shared/app/boost/1.56/lib/cm/shared/app/boost/1.56/ Boost库/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/bin/c++ CMakeFiles/tile_images.dir/src/tile_images.cpp.o -o tile_images -rdynamic /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/app/opencv/2.4.9/lib/libopencv_objtect.so.2.4.9 /cm/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_imgpro.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/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/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/共享/应用程序/opencv/2.4.9/lib/libopencv_杯3d.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_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
请注意,boost库的绝对路径是如何被删除的,并且不包括使用-L标志。然后我收到以下警告,暗示链接器正在/usr/lib64 64中拾取另一个老版本的boost安装。
/usr/bin/ld:警告: /cm/shared/apps/boost/1.56/lib/libboost_thread.so,需要的libboost_system.so.1.56.0可能与libboost_system.so.5冲突
然后链接失败,错误列表很长,可能是因为使用了旧的Boost库,但是代码是用更新的Boost头构建的。
如果我在CMakeLists.txt中添加以下内容:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${Boost_LIBRARY_DIRS}")
然后,代码链接没有问题。我花了一些时间进行研究,但到目前为止,对于如何让CMake包含-L标志或如何阻止它从boost库中剥离绝对路径,我已经画了一个空白。任何帮助都将不胜感激!
发布于 2014-11-28 16:40:57
我相信文档:set(Boost_REALPATH ON)
解释了这一点。
Boost_REALPATH -设置为ON以解析已发现的库的符号链接,以帮助打包。例如,"system“组件库可能被解析为"/usr/lib/libboost_system.so.1.42.0”,而不是"/usr/lib/libboost_system.so“。这不影响链接,除非用户需要此信息,否则不应启用。
https://stackoverflow.com/questions/27192401
复制相似问题