C++ 在CMake中查找目录 问题是:

C++ 在CMake中查找目录 问题是:,c++,boost,build,cmake,C++,Boost,Build,Cmake,我想在我的构建中添加作为include目录。这通常被编译为: c++-I/where/you/want/to/install/it/include/boost数字绑定 我从程序中引用的所有头文件都与此目录相关,因此在CMake中,我希望找到此目录(无论它安装在父系统的何处),并将其添加到include\u目录中 我要找的是: 大概是这样的: find_directory(BNB_INCLUDE_DIR boost-numeric-bindings) include_directories(${

我想在我的构建中添加作为include目录。这通常被编译为:

c++-I/where/you/want/to/install/it/include/boost数字绑定

我从程序中引用的所有头文件都与此目录相关,因此在CMake中,我希望找到此目录(无论它安装在父系统的何处),并将其添加到
include\u目录中

我要找的是: 大概是这样的:

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})
(这是我从库中需要的第一个文件),但这提供了文件的完整路径,而不是包含命令中指定文件的整个前缀的目录路径。

有关如何编写cmake Find文件的信息,请参阅。例如,我为lm传感器库编写了一个示例:

# - 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/”

编辑

在调用
find\u path
find\u package
之前,请确保已定义项目。否则将不会设置
CMAKE\u SYSTEM\u INCLUDE\u路径。例如:

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}")
结果成功找到
状态.hpp
,并将
增压状态\u 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数值绑定。我希望CMake能够自动找到它,如果它在这里(或在Windows等效工具中)。如果它安装在标准位置,当您使用
find
时,CMake已经在那里查找了。那么,在运行CMAKE时,您就不需要指定
CMAKE\u PREFIX\u PATH
。很抱歉,这让人困惑……此软件包的标准安装位置是
/usr/local/include/boost numeric bindings
,它不是标准的包含路径(例如,
/usr/local/include
),因此,如果没有明确包含
boost numeric bindings
目录,构建系统就不知道在哪里找到头文件。我想让CMake通过一种方法查看目录的标准位置
boost numeric bindings
,并返回该目录的完整路径。您在编辑中添加的内容与我已经尝试过的内容有何不同?当我只需要
/usr/local/include/boost numeric bindings/boost/numeric/bindings/traits/
时,路径将设置为
/usr/local/include/boost numeric bindings/
。如果这是错误的,请纠正我。它不适合我(cmake 2.8.10.2)。如果使用任何搜索路径(请参见
man cmake
中的
find_path
说明)作为前缀找到文件,它将在变量值中设置前缀。