0

My CMakeLists.txt file makes cmake point to the wrong version of Boost:

find_package(Boost COMPONENTS program_options)

In my case it points to Boost 1.39 in /otherDir/boost instead of Boost 1.50 in /usr/local/include/boost.

Since the version of Boost will change, I would like to avoid specifying it with:

find_package(Boost 1.50 COMPONENTS program_options)

or having to set the environment variable $ENV{BOOST_ROOT}.

The problem is due to the fact that the directory hierarchy has the following structure:

/usr/local/include/boost
/otherDir/boost
/otherDir/otherNeededFiles

and my CMakeLists.txt file contains:

include_directories(${Boost_INCLUDE_DIRS})
include_directories(/usr/local/include)
include_directories(/otherDir)

The value of Boost_INCLUDE_DIRS is correct (/usr/local/include), as the value of Boost_LIBRARIES (/usr/local/lib/libboost_program_options.a).

If I rename /otherDir/boost as /otherDir/boost_old, the linker is happy and points to the latest boost version. However I am not allowed to rename that directory.

Is it possible to do the equivalent of:

find_package(Boost latest COMPONENTS program_options)

Thank you.

4

2 回答 2

1

就像是

find_package(Boost latest COMPONENTS program_options)

您的应用程序布局不会自动实现,因为 CMake 中的查找宏只是启发式方法。这意味着每个查找宏都在查找宏的程序员设想的可能目录列表中搜索库。通常,查找宏将采用它找到的库的第一次出现,但没有这样的规则。CMake 目前普遍设想的唯一附加规范是最小精确版本的版本匹配。甚至这种匹配的实现目前也是由每个 find 宏自己执行的,甚至可能被忽略。因此,不存在以通用形式提供的最新版本。

您可以做的是将 Find_Boost.cmake 从 CMake 复制到您自己的项目中(如果许可证允许),并以始终搜索可用的最高版本的方式对其进行修改。但是当然,您必须自己维护该宏,这将导致工作,特别是对于复杂的升压安装布局。

通常,如果您在标准位置之外安装了同一软件的多个版本,则该知识不应嵌入特定项目的构建逻辑中,因为这可能会导致其他假设的其他系统出现问题。取而代之的是系统管理员的知识,他或她必须从外部传递到项目的构建系统中。我的建议是在 find_package 调用中正确指定编译和运行软件所需的最低版本的 boost。但是,需要通过在 CMake 命令行上定义 BOOST_ROOT 从外部传入系统上特定安装中要使用的特定版本。

于 2013-05-24T11:08:39.330 回答
1

这就是我们使用的。${THIRD_PARTY}/boost/boost_1_55_0/... 是磁盘上的内容。Boost_NO_SYSTEM_PATHS 使它忽略其他可能的位置。只有我关心的版本在 ${THIRD_PARTY}/boost 中,所以我可以精确控制更新。

# get boost
set(Boost_NO_SYSTEM_PATHS ON)
set(BOOST_ROOT ${THIRD_PARTY}/boost)
set(Boost_USE_STATIC_LIBS   OFF)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost COMPONENTS REQUIRED
            system
            date_time
            filesystem
            thread
            regex)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
message(STATUS "BOOST_ROOT = ${BOOST_ROOT}")
message(STATUS "Boost_VERSION = ${Boost_VERSION}")
message(STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}")
message(STATUS "Boost_MAJOR_VERSION = ${Boost_MAJOR_VERSION}")
message(STATUS "Boost_MINOR_VERSION = ${Boost_MINOR_VERSION}")
message(STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}")
message(STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}")
message(STATUS "Boost_LIBRARY_DIRS = ${Boost_LIBRARY_DIRS}")

由于 FindBoost 的工作方式,您想要的并不可靠。它将在所有位置查找“系统”,然后使用找到的第一个。即使这意味着其他所需的不存在。更糟糕的是,在您的情况下,它使用的是旧版本。

于 2015-03-12T22:52:33.287 回答