如何用CMake复刻Visual Studio式C语言库跨平台构建目录结构?
实现CMake与Visual Studio风格分离式构建目录结构
选择CMake作为跨平台构建工具是完全合理的,针对你在意的缓存文件污染和自定义目录结构需求,通过CMake的源码外构建+路径配置就能完美复刻你想要的Visual Studio风格目录。
核心方案思路
- 采用源码外构建:不在源码目录执行CMake命令,而是在
Builds目录下为Debug/Release分别创建独立的构建子目录,缓存文件会被隔离在各自的构建子目录中,不会污染源码。 - 通过CMake变量和目标属性,强制指定中间编译文件(
.o等)输出到Inter目录,最终构建产物(exe/库)输出到对应Debug/Release的子目录下。
具体实现步骤
1. 确认初始目录结构
确保你的目录和需求一致:
SolutionDir/ ├── ProjectName/ │ └── Source/ │ ├── lib.h │ └── lib.c └── Builds/ # 手动创建这个目录即可,子目录CMake会自动生成
2. 编写CMakeLists.txt
在ProjectName目录下创建CMakeLists.txt,内容如下:
cmake_minimum_required(VERSION 3.10) project(ProjectName C) # 收集源码文件(根据实际情况调整,也可以手动指定) file(GLOB_RECURSE SOURCES Source/*.c Source/*.h) # 生成目标:如果是库就用add_library,这里以可执行文件为例 add_executable(${PROJECT_NAME} ${SOURCES}) # 配置最终产物输出路径(对应Builds/Debug/ProjectName和Release/ProjectName) foreach(config DEBUG RELEASE) # 针对不同配置设置输出目录 set_target_properties(${PROJECT_NAME} PROPERTIES # 中间编译文件(.o/.obj)输出到Inter对应目录 COMPILE_OUTPUT_DIRECTORY_${config} "${CMAKE_SOURCE_DIR}/../Builds/Inter/${config}" # 最终可执行文件/库输出到对应配置的ProjectName子目录 RUNTIME_OUTPUT_DIRECTORY_${config} "${CMAKE_SOURCE_DIR}/../Builds/${config}/${PROJECT_NAME}" ARCHIVE_OUTPUT_DIRECTORY_${config} "${CMAKE_SOURCE_DIR}/../Builds/${config}/${PROJECT_NAME}" LIBRARY_OUTPUT_DIRECTORY_${config} "${CMAKE_SOURCE_DIR}/../Builds/${config}/${PROJECT_NAME}" ) endforeach()
3. 执行构建命令
打开终端,进入SolutionDir目录,分别构建Debug和Release版本:
构建Debug版本
# 创建并进入Debug构建目录 mkdir -p Builds/Debug && cd Builds/Debug # 生成构建文件,指定Debug模式 cmake ../../ProjectName -DCMAKE_BUILD_TYPE=Debug # 执行构建(Windows用msbuild,Linux/macOS用make或ninja) make
构建Release版本
# 返回SolutionDir,创建并进入Release构建目录 cd ../.. && mkdir -p Builds/Release && cd Builds/Release # 生成构建文件,指定Release模式 cmake ../../ProjectName -DCMAKE_BUILD_TYPE=Release # 执行构建 make
4. 最终目录结构验证
构建完成后,你的目录会自动生成所需子目录,完全匹配需求:
SolutionDir: ┝ Builds/ | ┝ Inter/ | | ┝ Debug/ | | | ┕ lib.o | | ┕ Release/ | | ┕ lib.o | ┝ Debug/ | | ┕ ProjectName/ | | ┕ ProjectName.exe | ┕ Release/ | ┕ ProjectName/ | ┕ ProjectName.exe ┕ ProjectName/ ┕ Source/ | lib.h ┕ lib.c
关键说明
- 缓存文件(如
CMakeCache.txt、CMakeFiles目录)会分别存放在Builds/Debug和Builds/Release中,完全与源码隔离。 - 如果需要支持更多构建配置(如RelWithDebInfo),只需在foreach循环中添加对应配置即可。
- Windows平台下使用MSBuild构建时,同样遵循此目录结构,无需额外调整。
内容的提问来源于stack exchange,提问作者OwenTheProgrammer
相关产品推荐
相关产品推荐

