【问题标题】:Finding a directory in CMake在 CMake 中查找目录
【发布时间】:2013-10-10 17:38:50
【问题描述】:

问题:

我想在我的构建中添加boost numeric bindings 作为包含目录。这通常编译为:

c++ -I/where/you/want/to/install/it/include/boost-numeric-bindings

我从我的程序中引用的所有头文件都是相对于这个目录的,所以在 CMake 中我想找到这个目录(无论它安装在父系统上的哪个位置)并将其添加到include_directories

我在寻找什么:

类似这样的:

find_directory(BNB_INCLUDE_DIR boost-numeric-bindings)

include_directories(${BNB_INCLUDE_DIR})

但是find_directory 命令不存在。我在这里遗漏了什么吗?

我尝试过的:

我试过了:

find_path(BNB_INCLUDE_DIR boost/numeric/bindings/traits/ublas_vector.hpp)

include_directories(${BNB_INCLUDE_DIR})

(这是我需要从库中获取的第一个文件),但这给了我文件的完整路径,而不是包含命令中指定文件的整个前缀的目录的路径。

【问题讨论】:

    标签: c++ boost build cmake


    【解决方案1】:

    有关如何编写 cmake Find 文件的信息,请参阅this answer。例如,这是我为 lm-sensors 库编写的:

    # - Try to find the LM_SENSORS library.
    #
    # The following are set after configuration is done: 
    #  LM_SENSORS_FOUND
    #  LM_SENSORS_INCLUDE_DIRS
    #  LM_SENSORS_LIBRARY_DIRS
    #  LM_SENSORS_LIBRARIES
    
    find_path(LM_SENSORS_INCLUDE_DIR NAMES sensors/sensors.h)
    find_library(LM_SENSORS_LIBRARY NAMES libsensors sensors)
    
    message("LM_SENSORS include dir = ${LM_SENSORS_INCLUDE_DIR}")
    message("LM_SENSORS lib = ${LM_SENSORS_LIBRARY}")
    
    set(LM_SENSORS_LIBRARIES ${LM_SENSORS_LIBRARY})
    set(LM_SENSORS_INCLUDE_DIRS ${LM_SENSORS_INCLUDE_DIR})
    
    include(FindPackageHandleStandardArgs)
    # Handle the QUIETLY and REQUIRED arguments and set the LM_SENSORS_FOUND to TRUE
    # if all listed variables are TRUE
    find_package_handle_standard_args(LM_SENSORS DEFAULT_MSG
                                      LM_SENSORS_LIBRARY LM_SENSORS_INCLUDE_DIR)
    
    mark_as_advanced(LM_SENSORS_INCLUDE_DIR LM_SENSORS_LIBRARY)
    

    更改以上内容以匹配您的库 (boost-numeric-bindings),将文件命名为 Findboost-numeric-bindings.cmake,并将其放入您的 cmake 模块目录中(或在您的源代码树中创建其中之一)。

    然后在您的 CMakeLists.txt 文件中,执行以下操作:

    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} your_cmake_module_dir)
    find_package (boost-numeric-bindings REQUIRED)
    include_directories(${BOOST_NUMERIC_BINDINGS_INCLUDE_DIR})
    

    然后,假设您没有在标准位置安装库,请按如下方式运行 cmake:

    cmake -D CMAKE_PREFIX_PATH:STRING="/where/you/have/installed/it/" <source path>

    编辑

    在调用find_pathfind_package 之前,请确保您已经定义了一个项目。否则CMAKE_SYSTEM_INCLUDE_PATH 将不会被设置。例如:

    find_path (BOOST_STATE_HPP boost/statechart/state.hpp)
    message ("CMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}")
    message ("CMAKE_SYSTEM_INCLUDE_PATH=${CMAKE_SYSTEM_INCLUDE_PATH}")
    message ("CMAKE_SYSTEM_FRAMEWORK_PATH=${CMAKE_SYSTEM_FRAMEWORK_PATH}")
    message ("CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}")
    message ("BOOST_STATE_HPP=${BOOST_STATE_HPP}")
    
    project (my_project)
    

    将导致以下 cmake 输出:

    CMAKE_FIND_ROOT_PATH=
    CMAKE_SYSTEM_INCLUDE_PATH=
    CMAKE_SYSTEM_FRAMEWORK_PATH=
    CMAKE_PREFIX_PATH=
    BOOST_STATE_HPP=BOOST_STATE_HPP-NOTFOUND
    

    而这个:

    project (my_project)
    
    find_path (BOOST_STATE_HPP boost/statechart/state.hpp)
    message ("CMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}")
    message ("CMAKE_SYSTEM_INCLUDE_PATH=${CMAKE_SYSTEM_INCLUDE_PATH}")
    message ("CMAKE_SYSTEM_FRAMEWORK_PATH=${CMAKE_SYSTEM_FRAMEWORK_PATH}")
    message ("CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}")
    message ("BOOST_STATE_HPP=${BOOST_STATE_HPP}")
    

    结果成功找到state.hpp 并将BOOST_STATE_HPP 设置为/usr/include,如您所愿:

    CMAKE_FIND_ROOT_PATH=
    CMAKE_SYSTEM_INCLUDE_PATH=/usr/include/w32api;/usr/X11R6/include;/usr/include/X11;/usr/pkg/include;/opt/csw/include;/opt/include;/usr/openwin/include
    CMAKE_SYSTEM_FRAMEWORK_PATH=
    CMAKE_PREFIX_PATH=
    BOOST_STATE_HPP=/usr/include
    

    【讨论】:

    • 我可以想象将这样的东西用于非标准安装,但通常(至少在 unix 上)绑定安装到 /usr/local/include/boost-numeric-bindings。如果它在这里(或在 Windows 等效项中),我希望 CMake 自动找到它。
    • 如果它安装在标准位置,当你使用find 时,cmake 已经在那里查找。然后你就不需要在运行 cmake 时指定CMAKE_PREFIX_PATH
    • 对不起,这令人困惑...这个包的标准安装位置是/usr/local/include/boost-numeric-bindings,它不是标准的包含路径(例如,/usr/local/include),所以构建系统如果不明确包含 boost-numeric-bindings 目录,不知道在哪里可以找到头文件。我希望 CMake 有一种方法可以查看目录 boost-numeric-bindings 的标准位置并返回该目录的完整路径。
    • 您在编辑中添加的内容与我已经尝试过的内容有何不同?当我想要的只是/usr/local/include/boost-numeric-bindings/ 时,路径将设置为/usr/local/include/boost-numeric-bindings/boost/numeric/bindings/traits/。如有错误请指正。
    • 它对我不起作用(cmake 2.8.10.2)。如果使用任何搜索路径(参见man cmake 中的find_path 描述)作为前缀找到文件,它将在变量值中设置前缀。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多