【问题标题】:CMake: how to point to the latest version of a library?CMake:如何指向最新版本的库?
【发布时间】:2013-05-23 10:06:58
【问题描述】:

我的 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_INCLUDE_DIRS 的值是正确的 (/usr/local/include),与 Boost_LIBRARIES (/usr/local/lib/libboost_program_options.a) 的值一样。

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

是否有可能做相当于:

find_package(Boost latest COMPONENTS program_options)

谢谢。

【问题讨论】:

    标签: boost path linker cmake


    【解决方案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 的工作方式,您想要的并不可靠。它将在所有位置查找“系统”,然后使用找到的第一个。即使这意味着其他所需的不存在。更糟糕的是,在您的情况下,它使用的是旧版本。

    【讨论】:

      【解决方案2】:

      类似

      find_package(Boost latest COMPONENTS program_options)
      

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-26
        • 1970-01-01
        • 2019-02-21
        • 2016-02-27
        • 2023-03-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多