Boost CMake:如何指向库的最新版本?

Boost CMake:如何指向库的最新版本?,boost,path,linker,cmake,Boost,Path,Linker,Cmake,我的CMakeLists.txt文件使cmake指向错误版本的Boost: find_package(Boost COMPONENTS program_options) 在我的例子中,它指向/otherDir/Boost中的Boost 1.39,而不是/usr/local/include/Boost中的Boost 1.50 由于Boost的版本将发生更改,因此我希望避免使用以下选项指定它: find_package(Boost 1.50 COMPONENTS program_options)

我的CMakeLists.txt文件使cmake指向错误版本的Boost:

find_package(Boost COMPONENTS program_options)
在我的例子中,它指向
/otherDir/Boost
中的Boost 1.39,而不是
/usr/local/include/Boost
中的Boost 1.50

由于Boost的版本将发生更改,因此我希望避免使用以下选项指定它:

find_package(Boost 1.50 COMPONENTS program_options)
或者必须设置环境变量$ENV{BOOST_ROOT}

问题是由于目录层次结构具有以下结构:

/usr/local/include/boost
/otherDir/boost
/otherDir/otherNeededFiles
我的CMakeLists.txt文件包含:

include_directories(${Boost_INCLUDE_DIRS})
include_directories(/usr/local/include)
include_directories(/otherDir)
Boost\u INCLUDE\u DIRS
的值是正确的(
/usr/local/INCLUDE
),与
Boost\u库的值一样(
/usr/local/lib/libboost\u program\u options.a

如果我将
/otherDir/boost
重命名为
/otherDir/boost\u old
,链接器会很高兴并指向最新的boost版本。但是,我不允许重命名该目录

是否可以执行以下等效操作:

find_package(Boost latest COMPONENTS program_options)
谢谢你。

类似

find_package(Boost latest COMPONENTS program_options)
由于CMake中的“查找宏”只是试探法,因此应用程序布局不可能自动执行。这意味着每个find宏在find宏的程序员设想的可能目录列表中搜索库。通常,find宏将第一次出现在它找到的库中,但没有这样的规则。CMake目前普遍设想的唯一附加规范是最低版本或精确版本的版本匹配。甚至这种匹配的实现目前也由每个find宏自己执行,甚至可能被忽略。因此,没有通用形式的最新版本

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


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

这就是我们使用的${第三方}/boost/boost\u 1\u 55\u 0/。。。是磁盘上的内容。Boost_NO_SYSTEM_路径使其忽略其他可能的位置。只有我关心的版本在${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的工作方式,您想要的东西不可靠。它将在所有位置查找“系统”,然后使用找到的第一个。即使这意味着其他必需的也不存在。更糟糕的是,在您的情况下,它使用的是旧版本