---
title: "源文件与头文件的处理"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/source-header-file-processing/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/02-编程语言与运行时/源文件与头文件的处理.md"
content_hash: a4533f15344782a4176e2da8b7d8290dd6da1d1bdcb9ec8dc89470ee9b07c79b
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 源文件与头文件的处理

﻿# 源文件与头文件的处理

源文件（通常为 `.cpp` 或 `.c` 文件）和头文件（通常为 `.h` 或 `.hpp` 文件）


## 头文件
头文件主要用于声明：
- **函数原型**：声明函数的名称、参数类型及返回类型。
- **类定义**：声明类及其成员函数、成员变量。
- **宏定义**：定义常量、宏或包含一些编译时条件。
头文件通常不会包含实现细节，而是为源文件提供接口。这意味着头文件只会在被包含在某个源文件中时才参与编译。

### **处理方式**
- **包含（Include）机制**：当一个源文件使用 `#include "header_file.h"` 时，编译器将直接将头文件的内容插入到源文件的包含位置。这种处理方式使得头文件的内容能够在多个源文件中共享，而无需重复定义。
- **编译过程**：头文件本身不会被单独编译。编译器在处理源文件时，通过 `#include` 指令将头文件的内容包含进来，然后将包含后的源文件编译成目标文件（`.o` 或 `.obj` 文件）。
- **管理方法**：在 CMake 中，头文件的路径通常通过 `include_directories()` 来管理，这样编译器在处理源文件时能找到正确的头文件。例如：

```cmake
include_directories(${CMAKE_SOURCE_DIR}/include)
```

## 源文件
源文件包含实际的实现代码，即函数和类的定义。它们是项目中实际被编译的单元，每个源文件在编译后生成一个目标文件（`.o` 或 `.obj` 文件），然后这些目标文件会被链接成最终的可执行文件或库。

### **处理方式**
- **编译**：每个源文件都会独立编译成一个目标文件。编译器会解析源文件的内容，并根据包含的头文件信息生成机器代码。
- **链接**：编译生成的所有目标文件会被链接器链接成最终的二进制文件。这一步会解析和绑定所有的外部引用（例如其他源文件中定义的函数和变量）。
- **管理方法**：在 CMake 中，源文件通常通过变量（如 `SOURCES`）来管理。您可以手动指定文件，也可以使用 `file(GLOB ...)` 自动查找文件。例如：

```cmake
file(GLOB SOURCES "src/*.cpp")
add_executable(MyExecutable ${SOURCES})
```


## CMake处理方式
- **头文件管理**：通过 `include_directories()` 指定头文件所在的目录，使编译器能够找到头文件。头文件目录的配置通常是全局的，适用于整个项目。

- **源文件管理**：通过 `add_executable()` 或 `add_library()` 将源文件添加到构建目标中。CMake 处理源文件列表，并确保它们被编译和链接。

编译过程:
- **预处理**：编译器处理所有的 `#include` 指令，将头文件的内容插入到源文件中。
- **编译**：编译器将处理过的源文件转换为目标文件。
- **链接**：链接器将所有目标文件及依赖的库文件链接成一个可执行文件或库。
