# props **Repository Path**: arhunn/props ## Basic Information - **Project Name**: props - **Description**: vs properties document - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-23 - **Last Updated**: 2025-09-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # C++ 项目构建系统标准作业程序 (SOP) **版本: 1.0** **最后更新时间: 2025-08-23** ## 1. 概述 ### 1.1. 目的 本文档旨在规范化C++项目的Visual Studio构建环境,通过将构建配置与源代码分离,实现构建逻辑的**版本化**、**模块化**与**可复用性**。本规范旨在提升项目可维护性、降低团队协作成本,并为未来向CMake等跨平台构建系统的迁移奠定坚实基础。 ### 1.2. 核心思想 - **构建配置中心化**:所有通用的构建逻辑(编译器选项、链接器选项、输出路径等)集中存放在一个独立的Git仓库中(`props`)。 - **Git Submodule集成**:主项目通过Git Submodule机制引入并锁定特定版本的构建配置。 - **自动化加载**:利用MSBuild的`Directory.Build.props`机制,实现构建配置的自动加载,无需手动修改每个项目文件。 - **关注点分离**:项目文件(`.vcxproj`)只关心其包含的源文件,业务源代码与构建系统文件物理分离。 ### 1.3. 适用范围 本文档适用于所有使用Visual Studio作为主要IDE的C++项目。 ## 2. 规范与定义 ### 2.1. 目录结构规范 所有项目必须遵循以下标准目录结构: ``` YourSolutionRoot/ | |-- .git/ # 主项目的Git元数据 |-- .gitignore # 全局Git忽略文件 |-- .gitmodules # Git Submodule配置文件 |-- Directory.Build.props # 【引导文件】用于加载Submodule中的构建配置 | |-- build/ # 【构建产物】所有编译和链接的输出,此目录由.gitignore忽略 | |-- props/ # 【Git Submodule】指向公司统一的构建配置仓库 | |-- Directory.Build.props # (真正的核心配置文件) | |-- Configurations.props | |-- Global.props | |-- Compiler.props | |-- Linker.props | |-- Output.props | |-- README.md | |-- solution/ # 【VS项目文件】存放所有.sln, .vcxproj, .vcxproj.filters文件 | |-- YourSolution.sln | |-- project1.vcxproj | |-- project1.vcxproj.filters | |-- project1.props # (项目专属属性) | |-- ... | |-- src/ # 【项目源代码】存放所有业务逻辑代码 | |-- project1/ | | |-- include/ | | |-- src/ | |-- ... | |-- 3rdParty/ # 【第三方库】存放所有第三方库的源代码 | |-- spdlog/ | | |-- spdlog.props # (spdlog专属的属性表) | |-- ... | |-- docs/ # 【文档】存放项目相关文档 |-- README.md # 主项目说明文件 ``` ### 2.2. 文件职责定义 (已更新) | 文件路径 | 职责 | 修改频率 | | :--- | :--- | :--- | | `/Directory.Build.props` | **引导文件 (Bootstrapper)**。唯一作用是加载`props/Directory.Build.props`。通常不需修改。 | 极低 | | `props/Directory.Build.props` | **配置枢纽 (Configuration Hub)**。**职责已扩展:**
1. 定义所有基础路径变量(`SolutionRoot`, `BuildOutputRoot`等)。
2. **定义最核心的平台属性(`PlatformToolset`, `WindowsTargetPlatformVersion`)和项目类型(`ConfigurationType`),确保它们在VS默认属性表之前生效。**
3. 作为属性系统的入口,导入`Global.props`。 | 低 | | `props/Global.props` | **全局调度中心 (Dispatcher)**。**职责更聚焦:**
1. 定义全局元数据(如`SolutionVersion`, `Copyright`)。
2. 定义辅助变量(如`PlatformShortName`)。
3. **调度导入**其他功能单一的属性表(`Configurations.props`, `Output.props`, `Compiler.props`, `Linker.props`等)。 | 低 | | `props/Output.props` | **输出路径专家**。统一管理所有中间文件(obj)和最终产物(bin/lib/exe)的输出路径及命名规则(`IntDir`, `OutDir`, `TargetName`)。 | 低 | | `props/Compiler.props` | **编译器管家**。统一管理所有项目的编译器设置(警告级别、C++标准、宏定义等)。 | 中 | | `props/Linker.props` | **链接器专家**。统一管理所有项目的链接器设置(库目录、依赖项等)。 | 中 | | `solution/*.vcxproj` | **项目定义文件**。只负责定义项目包含的源文件、头文件,以及项目专属的属性表导入(如第三方库的`.props`)。 | 高 | | `solution/*.vcxproj.filters` | **IDE视图文件**。负责在Visual Studio的Solution Explorer中组织文件的逻辑视图。 | 高 | | `solution/*.props` (可选) | **项目专属属性**。定义特定项目独有的配置(如特殊的宏定义、专用的头文件目录等)。 | 中 | ## 3. 标准作业程序 (SOP) ### 3.1. 环境搭建:初始化一个新项目 此流程仅在创建全新解决方案时执行一次。 1. **创建主项目Git仓库** - 在Git服务器上创建项目仓库。 - 在本地克隆空仓库:`git clone YourSolutionRoot` - `cd YourSolutionRoot` 2. **添加`props`子模块** - 执行命令:`git submodule add props` - 这将创建`props`目录并从远程拉取构建配置。 3. **创建引导文件** - 在项目根目录 (`YourSolutionRoot/`) 创建文件 `Directory.Build.props`。 - 填入内容 (参考附录 A.1)。 4. **创建`.gitignore`文件** - 在项目根目录创建`.gitignore`文件。 - 至少包含以下内容,以忽略构建产物和用户特定的IDE文件: ```gitignore # Visual Studio .vs/ *.suo *.user *.sln.docstates # Build output [Bb]uild/ [Dd]ebug/ [Rr]elease/ x64/ Win32/ *.obj *.pdb *.ilk *.exe *.dll *.lib *.tlog *.log # Other *~ ``` 5. **创建其他目录** - 手动创建 `solution/`, `src/`, `3rdParty/`, `docs/` 目录。 6. **创建Visual Studio解决方案** - 打开Visual Studio,选择 "Create a new project" -> "Blank Solution"。 - **位置**:选择 `YourSolutionRoot/solution/` 目录。 - **名称**:`YourSolution`。 7. **首次提交** - `git add .` - `git commit -m "Initial project structure setup"` - `git push` ### 3.2. 日常开发:克隆现有项目 所有团队成员加入项目时执行此流程。 1. **克隆主仓库并初始化子模块** ```bash git clone --recurse-submodules ``` 如果已经克隆但忘记了 `--recurse-submodules`,则执行: ```bash cd git submodule update --init --recursive ``` 2. **打开解决方案** - 直接双击 `solution/YourSolution.sln` 文件即可开始工作。 ### 3.3. 日常开发:添加一个新项目 (例如 `libutils`) 1. **在VS中创建项目** - 在Solution Explorer中,右键点击解决方案 -> "Add" -> "New Project..."。 - 选择项目模板(如 Static Library)。 - **项目名称**:`libutils`。 - **位置**:确保是 `YourSolutionRoot/solution/`。 2. **创建源代码目录** - 在 `src/` 目录下创建 `libutils/` 文件夹,并内部创建 `include/` 和 `src/` 子目录。 - 将源代码文件(如 `utility.h`, `utility.cpp`)放入相应目录。 3. **(可选) 创建项目专属属性表** - 如果 `libutils` 有特殊配置(如专属宏),在 `solution/` 目录下创建 `libutils.props` 文件。 - 示例内容 `solution/libutils.props`: ```xml LIBUTILS_STATIC;%(PreprocessorDefinitions) ``` 4. **清理并配置`.vcxproj`文件** - 用文本编辑器打开 `solution/libutils.vcxproj`。 - **删除所有``和``**,因为它们已由通用属性表管理。 - 确保文件结构简洁,使用我们定义的路径变量引用源文件 (参考附录 A.4)。 5. **配置`.vcxproj.filters`文件** - 为了在IDE中获得正确的目录视图,用文本编辑器打开 `solution/libutils.vcxproj.filters`,手动编辑使其逻辑路径与 `src/libutils/` 下的物理路径匹配。 6. **提交变更** - 将新创建的文件 (`.vcxproj`, `.filters`, `.props`, 源代码) 添加到Git并提交。 ### 3.4. 维护:更新通用构建配置 当需要全局修改构建规则时(如升级C++标准)。 1. **进入`props`子模块目录** - `cd props` 2. **切换到开发分支 (推荐)** - `git checkout -b feature/update-cpp-standard` 3. **修改配置** - 编辑 `Compiler.props` 或其他相关文件。例如,将 `stdcpp20` 改为 `stdcpp23`。 4. **提交并推送变更**到`props`仓库 - `git add .` - `git commit -m "Feat: Upgrade C++ standard to C++23"` - `git push -u origin feature/update-cpp-standard` - (通过Pull Request等流程合并到`props`仓库的主分支) 5. **在主项目中应用更新** - 回到主项目根目录: `cd ..` - 更新子模块以指向最新的commit: `git submodule update --remote --merge` - 查看状态,你会看到 `props` 目录有新的提交待处理: `git status` - 提交此更新: ```bash git add props git commit -m "Chore: Update build system to latest version" git push ``` ### 3.5. 解决方案配置管理 1. **打开配置管理器** ("Build" -> "Configuration Manager...")。 2. **清理/创建解决方案配置**,使其名称与 `props/Configurations.props` 中定义的保持一致(如 `debug_shared`, `release_static_md`)。 3. **映射项目配置**:确保对于每个解决方案配置,所有项目都正确地映射到对应的项目配置和平台。 ### 3.6. 高级用法:管理项目专属配置 在复杂解决方案中,并非所有项目都需要全部的构建配置。例如,一个纯静态库项目不需要“动态库(shared)”相关的配置。本节将介绍如何实现配置的按需加载。 1. 核心机制 我们通过定义一个名为 `$(ProjectConfigType)` 的MSBuild属性来控制项目所需的配置类型。 在 `props/Configurations.props` 中,使用 `Condition` 属性包裹不同配置的 `ItemGroup`。 支持的 `ProjectConfigType` 值包括: - `StaticAndShared` (默认): 项目同时需要静态库和动态库配置。 - `StaticOnly`: 项目只需要静态库配置。 - `SharedOnly`: 项目只需要动态库配置。 ```xml StaticAndShared debug_shared x64 debug_static_md x64 ``` 2. 在特定项目的专属 `.props` 文件(如 `solution/lib_static_only.props`)中定义该变量。 ```xml StaticOnly ``` 3. 在 `.vcxproj` 文件的顶部导入此专属 `.props` 文件。 --- ## 4. 附录:核心文件示例 ### A.1. `/Directory.Build.props` (引导文件) ```xml ### A.2. props/Directory.Build.props (配置枢纽) ```xml $(MSBuildThisFileDirectory) $(PropsRoot)..\ $(SolutionRoot)solution\ $(SolutionRoot)src\ $(SolutionRoot)3rdParty\ $(SolutionRoot)build\ 10.0 v143 Unicode false Application DynamicLibrary StaticLibrary ``` ### A.3. props/Global.props (全局调度中心) ```xml 1.0.0.1 Copyright (c) 2025 Your Company Win32 x64 ``` ### A.4. solution/my_project.vcxproj (清理后的项目文件示例) ```xml {YOUR-UNIQUE-GUID-HERE} my_project ```