CMake,链接目录和多个Boost安装

CMake, link directories and multiple Boost installations

本文关键字:Boost 安装 链接 CMake      更新时间:2023-10-16

我正在没有root权限的服务器上工作。我有一个简单的命令行应用程序,链接到OpenCV和Boost,我正在使用cmake 2.8.12。/usr/lib64 中有旧的提升库,但我想使用可以使用环境模块加载的较新的提升库。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/apps/boost/1.56/lib /cm/shared/apps/boost/1.56/include

提升库 /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_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 /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_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 /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

请注意,提升库的绝对路径是如何被剥离的,并且没有使用 -L 标志包含它。然后我收到以下警告,暗示链接器正在/usr/lib64 中选取另一个较旧的 boost 安装

/

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:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${Boost_LIBRARY_DIRS}"(

然后代码链接没有问题。我花了一些时间研究,但到目前为止,我已经为如何让 CMake 包含 -L 标志或如何阻止它从提升库中剥离绝对路径绘制了一个空白。任何帮助将不胜感激!

我相信这在文档中得到了解释:set(Boost_REALPATH ON) .

Boost_REALPATH - 设置为 ON 以解析已发现的符号链接 库协助打包。 例如 "系统"组件库可以解析为 "/usr/lib/libboost_system.so.1.42.0" 而不是 "/usr/lib/libboost_system.so"。 这不 影响链接,不应启用,除非 用户需要此信息。