【问题标题】:cmake including h files from other directoriescmake 包括来自其他目录的 h 文件
【发布时间】:2012-04-02 23:42:47
【问题描述】:

在 cmake 项目下包含测试时遇到问题。我的项目是这样设置的:

                                       TerrainMap
                                        /     \
                         PointAccumulator     heightQuadGrid
                                                \
                                                 Test

在 TerrainMap 目录中,CMakeLists.txt 文件简单地概述了 cmake 版本、项目名称并包括两个子目录。

在 heightQuadGrid 中,CMakeLists.txt 如下所示:

cmake_minimum_required(VERSION 2.8)

find_package(PCL 1.2 REQUIRED)
find_package(OpenCV REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_library(heightQuadGrid heightQuadGrid.cpp)

add_subdirectory(Test)

据我了解,它创建了一个名为 heightQuadGrid 的库。 Test 中的 CMakeLists.txt 如下所示:

FIND_PACKAGE(PCL 1.2 REQUIRED)
FIND_PACKAGE(OpenCV REQUIRED)
FIND_PACKAGE(Boost COMPONENTS unit_test_framework REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS} )

link_libraries(heightQuadGrid)

add_executable(heightQuadTreeTest heightQuadGridTest.cpp)
target_link_libraries (heightQuadTreeTest heightQuadGrid ${PCL_LIBRARIES} ${OpenCV_LIBS} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

最后,cpp 文件 heightQuadGridTest.cpp 包含以下内容:

#include <heightQuadGrid/heightQuadGrid.h>

cmake 工作正常,但是当我去制作项目时它告诉我它找不到 heightQuadGrid/heightQuadGrid.h

我在另一个工作项目中看到了非常相似的方法,这是怎么回事?

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:
    #include <heightQuadGrid/heightQuadGrid.h>
    

    此语法表示项目的“包含目录”之一应该是heightQuadGrid 目录上方的目录。在 heightQuadTreeTest 可执行文件的 cmakelists.txt 文件中,您需要上两个目录,并将其添加为包含目录:

    include_directories(../../)
    

    【讨论】:

    • 不,我不这么认为,对我来说,这表明我正在尝试从我已适当链接的库 heightQuadGrid 中获取 heightQuadGrid.h。
    • 如果我错了,请纠正我(我的机器上没有你的目录结构),但是“正确链接”告诉 链接器 去哪里看......包含目录告诉编译器去哪里找。
    • 好的,我想我明白你的意思,但我需要包括 2 个目录还是只包含一个到 heightQuadGrid.h 所在的目录?然后我如何将它包含在我的 cpp 文件中,就像我所做的那样?
    • 我很抱歉这有效。我不确定我是否真的明白为什么。不过谢谢。对于任何人来说,一个更简洁的解决方案是执行 include_directories(${CMAKE_SOURCE_DIR})
    • 很高兴它成功了。当您#include 某些东西时,编译器会查看“包含目录”,然后查找与这些目录相关的文件(包括您在该#include 中拥有的子目录)。在您的情况下,heightQuadGrid 是子目录,heightQuadGrid.h 是文件。因此,您需要该子目录 above 的目录,以便在附加整个内容时,完整路径是有效的。 include_dir/subdir/file 换句话说。正如您所注意到的,${CMAKE_SOURCE_DIR} 也可以工作 - 这是因为在这种情况下,它与您的目录结构中的 ../../ 是同一个目录。
    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    相关资源
    最近更新 更多