VSCode CC++项目多个源文件调试

目录结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
E:.
│ CMakeLists.txt
│ main.c
│ tree.txt

├───.vscode
│ settings.json

├───include
│ main.h
│ test.h

└───src
test.c

文件内容

1
2
3
4
5
6
7
8
9
//main.h
#ifndef _MAIN_H
#define _MAIN_H

#include <stdio.h>
#include "test.h"

#endif

1
2
3
4
5
6
7
8
9
//main.c
#include "main.h"

int main(int argc, char const *argv[])
{
int res = add(2, 3);
printf("%d\n", res);
return 0;
}
1
2
3
4
5
6
7
//test.h
#ifndef _TEST_H
#define _TEST_H

int add(int a, int b);

#endif
1
2
3
4
5
6
//test.c
#include "test.h"

int add(int a, int b) {
return a + b;
}

重点关注下面的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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 …])

  • 命令格式

    1
    include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

    将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。

  • 命令解析

    默认情况下,include_directories命令会将目录添加到列表最后,可以通过命令设置CMAKE_INCLUDE_DIRECTORIES_BEFORE变量为ON来改变它默认行为,将目录添加到列表前面。也可以在每次调用include_directories命令时使用AFTERBEFORE选项来指定是添加到列表的前面或者后面。如果使用SYSTEM选项,会把指定目录当成系统的搜索目录。该命令作用范围只在当前的CMakeLists.txt。

aux_source_directory(<DIR> <VAR_NAME>)

  • 命令解析

    查找DIR目录下的所有源文件,并将其放入VAR_NAME变量。

include_directories()

  • 命令格式

    1
    add_executable (<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [source1] [source2 ...])

    使用指定的源文件来生成目标可执行文件。这里的目标可执行文件分为三类:普通可执行目标文件导入可执行目标文件别名可执行目标文件。分别对应上面的三种命令格式。

  • 命令解析

    • <name> 生成的可执行目标的名字,在一个cmake工程中,这个名字必须全局唯一。
    • [source1] [source2 …] 构建可执行目标文件所需要的源文件。也可以通过target_sources()继续为可执行目标文件添加源文件,要求是在调用target_sources之前,可执行目标文件必须已经通过add_executableadd_library定义了。