【学习】windows下cmake学习(二)——引入头文件
上节回顾
上一节写了最简单的hello world通过CmakeList编译并生成可执行文件,这节将学习如何用CmakeList引入头文件(怎么写着写着跟讲课稿是的)
目录结构
B-hello-headers
├───build
├───include
│ Hello.h
│
└───src
Hello.cpp
main.cpp
通过Hello.h定义类及成员函数,Hello.cpp负责实现成员函数,main.cpp进行调用
// Hello.h
#ifndef __HELLO_H__
#define __HELLO_H__
class Hello
{
public:
void print();
};
#endif
// Hello.cpp
#include <iostream>
#include "Hello.h"
void Hello::print()
{
std::cout << "Hello Headers!" << std::endl;
}
// main.cpp
#include "Hello.h"
int main(int argc, char *argv[])
{
Hello hi;
hi.print();
return 0;
}
正文
使用上一节的CmakeLists
仍旧按照上节内容中CmakeLists的写法
cmake_minimum_required(VERSION 3.5)
project (hello_headers)
set(SOURCES
src/Hello.cpp
src/main.cpp
)
add_executable(hello_headers ${SOURCES})
在build目录下cmake
cmake -G "MinGW Makefiles" ..
会发现项目构建成功,接下来尝试make
make
[ 33%] Building CXX object CMakeFiles/hello_headers.dir/src/Hello.cpp.obj
E:\CodeSpace\Cpp_Study\B-hello-headers\src\Hello.cpp:2:10: fatal error: Hello.h: No such file or directory
#include "Hello.h"
^~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles\hello_headers.dir\build.make:75: CMakeFiles/hello_headers.dir/src/Hello.cpp.obj] Error 1
make[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/hello_headers.dir/all] Error 2
make: *** [Makefile:90: all] Error 2
报错中提示无法找到Hello.h文件,这时就需要引入CmakeLists中一个重要的关键字target_include_directories
引入target_include_directories
target_include_directories:让编译器识别不同的文件夹,主要用来为target指定包含头文件的目录。
因此,对于这个demo来说,我们可以在CmakeLists中加入target_include_directories
# cmake最低版本
cmake_minimum_required(VERSION 3.5)
# 项目名称
project (hello_headers)
# 创建一个SOURCES变量,设置为当前目录下的所有.cpp文件,方便使用
set(SOURCES
src/Hello.cpp
src/main.cpp
)
# 使用SOURCES变量中关联的cpp文件创建可执行文件hello_headers
add_executable(hello_headers ${SOURCES})
# 包含头文件的目录
target_include_directories(hello_headers
PRIVATE
${PROJECT_SOURCE_DIR}/include
)
重新cmake并make
.\hello_headers.exe
Hello Headers!
显示详情
当我们使用make时,控制台仅会输出百分比及完成状态,若想要显示更细致的内容可以添加VERBOSE=1
make VERBOSE=1