我有关于包含头文件的问题。
错误消息
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
)
答案 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
编译标志的显式设置。