目录结构如下
E:.
│ CMakeLists.txt
│ main.c
│ tree.txt
│
├───.vscode
│ settings.json
│
├───include
│ main.h
│ test.h
│
└───src
test.c
文件内容
//main.h
#ifndef _MAIN_H
#define _MAIN_H
#include <stdio.h>
#include "test.h"
#endif
//main.c
#include "main.h"
int main(int argc, char const *argv[])
{
int res = add(2, 3);
printf("%d\n", res);
return 0;
}
//test.h
#ifndef _TEST_H
#define _TEST_H
int add(int a, int b);
#endif
//test.c
#include "test.h"
int add(int a, int b) {
return a + b;
}
重点关注下面的文件
#CMakeLists.txt
cmake_minimum_required(VERSION 3.0.0)
project(tt VERSION 0.1.0 LANGUAGES C)
# 由CMake tools创建的无需改变得内容
include(CTest)
enable_testing()
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
# 以下内容是修改过或者添加的
# 将项目根目录的源文件加入ALL_SOURCE变量
aux_source_directory(. ALL_SOURCE)
# 将项目根目录下src目录的源文件加入ALL_SOURCE变量
aux_source_directory(${PROJECT_SOURCE_DIR}/src ALL_SOURCE)
# 包括头文件文件夹
include_directories(${PROJECT_SOURCE_DIR}/include)
# 用ALL_SOURCE中的所有源文件构建项目,可执行文件的名字为main
add_executable(main ${ALL_SOURCE})
语句说明
include_directories ([AFTER|BEFORE] [SYSTEM] dir1 [dir2 …])
-
命令格式
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。
-
命令解析
默认情况下,
include_directories
命令会将目录添加到列表最后,可以通过命令设置CMAKE_INCLUDE_DIRECTORIES_BEFORE
变量为ON
来改变它默认行为,将目录添加到列表前面。也可以在每次调用include_directories
命令时使用AFTER
或BEFORE
选项来指定是添加到列表的前面或者后面。如果使用SYSTEM
选项,会把指定目录当成系统的搜索目录。该命令作用范围只在当前的CMakeLists.txt。
aux_source_directory(<DIR> <VAR_NAME>)
-
命令解析
查找DIR目录下的所有源文件,并将其放入VAR_NAME变量。
include_directories()
- 命令格式
使用指定的源文件来生成目标可执行文件。这里的目标可执行文件分为三类:add_executable (<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [source1] [source2 ...])
普通可执行目标文件
、导入可执行目标文件
、别名可执行目标文件
。分别对应上面的三种命令格式。 - 命令解析
- <name> 生成的可执行目标的名字,在一个cmake工程中,这个名字必须全局唯一。
- [source1] [source2 …] 构建可执行目标文件所需要的源文件。也可以通过
target_sources()
继续为可执行目标文件添加源文件,要求是在调用target_sources
之前,可执行目标文件必须已经通过add_executable
或add_library
定义了。