CMake如何设置src根目录,以便始终从根目录而不是相对路径中查找头文件?

时间:2017-06-13 02:48:44

标签: c++ cmake

我有关于包含头文件的问题。

错误消息

In file included from /path/to/src/main.cpp:1:
/path/to/src/dirA/testA.h:1:10: fatal error: 'common/util.h' file not found
#include "common/util.h"

目录

├── dirA
│   └── testA.h
├── common
│   └── util.h
└── main.cpp

的main.cpp

#include "dirA/testA.h"

int main()
{}

testA.h

#include "common/util.h" // <--- Here is the error point

的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

add_definitions("-std=c++11") 

add_executable(main
  main.cpp
)

我发现以下方法很好,但我不想考虑文件路径关系。

#include "../common/util.h"

更新1

感谢Mark Farrugia的回答,构建错误已经解决。但是,我喜欢“common / util.h”比“util.h”更好,因为路径很容易理解。它可能会避免重复的定义。

testA.h

#include "util.h"

的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

add_definitions("-std=c++11") 

include_directories("common")

add_executable(main
  main.cpp
)

2 个答案:

答案 0 :(得分:1)

使用CMake的include_directories命令。

https://cmake.org/cmake/help/v3.0/command/include_directories.html

以下内容将包括项目范围内common目录中的所有文件:

include_directories(common);

将此用作:

#include <util.h>

或者如果您想使用#include指令中的文件夹:

include_directories(.)

这样您就可以执行以下操作:

#include <common/util.h>

答案 1 :(得分:1)

虽然include_directories可以在这里使用,但除非您遇到一个非常旧的(早于2.8.10)CMake版本,target_include_directories应该是解决此问题的首选命令:

cmake_minimum_required(VERSION 3.1)

add_executable(main
    main.cpp
)
target_include_directories(main PUBLIC .)
set_property(TARGET main PROPERTY CXX_STANDARD 11)
set_property(TARGET main PROPERTY CXX_STANDARD_REQUIRED ON)

在较新的CMake版本中,如果可用,您应该始终使用target_*形式的命令。这对于大型项目尤为重要,因为大型项目纯粹基于源文件的物理布局(这是旧的,基于目录的命令强制您执行的操作)来管理构建,这可能非常困难。新命令还提供了一些额外的功能,例如将属性传递给依赖目标,这对于更复杂的构建非常方便。

如果您可以自由使用CMake 3.1或更高版本,您还可以使用上面的可移植代码替换std=c++11编译标志的显式设置。