cmake by mohitmishra786/low-level-dev-skills
npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill cmake指导代理在现代(以目标为先)的 CMake 环境中处理 C/C++ 项目:包括外部构建、依赖管理、生成器选择,以及与 CI 和 IDE 的集成。
target_* 命令。PUBLIC/PRIVATE/INTERFACE 来控制属性传播。include_directories() 或 link_libraries()(旧式命令)。cmake_minimum_required(VERSION 3.20)。广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
cmake_minimum_required(VERSION 3.20)
project(MyApp VERSION 1.0 LANGUAGES C CXX)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(myapp
src/main.c
src/utils.c
)
target_include_directories(myapp PRIVATE include)
target_compile_options(myapp PRIVATE -Wall -Wextra)
# 静态库
add_library(mylib STATIC lib/foo.c lib/bar.c)
target_include_directories(mylib
PUBLIC include # 使用者会获得此包含路径
PRIVATE src # 只有 mylib 本身能看到此路径
)
# 共享库
add_library(myshared SHARED lib/foo.c)
set_target_properties(myshared PROPERTIES
VERSION 1.0.0
SOVERSION 1
)
# 将可执行文件链接到库
add_executable(myapp src/main.c)
target_link_libraries(myapp PRIVATE mylib)
# 外部构建(始终这样做)
cmake -S . -B build
cmake --build build
# 使用生成器
cmake -S . -B build -G Ninja
cmake --build build -- -j$(nproc)
# 调试构建
cmake -S . -B build-debug -DCMAKE_BUILD_TYPE=Debug
cmake --build build-debug
# 发布构建
cmake -S . -B build-release -DCMAKE_BUILD_TYPE=Release
cmake --build build-release
# 安装
cmake --install build --prefix /usr/local
构建类型:Debug、Release、RelWithDebInfo、MinSizeRel。
find_package(OpenSSL REQUIRED)
target_link_libraries(myapp PRIVATE OpenSSL::SSL OpenSSL::Crypto)
find_package(Threads REQUIRED)
target_link_libraries(myapp PRIVATE Threads::Threads)
find_package(ZLIB REQUIRED)
target_link_libraries(myapp PRIVATE ZLIB::ZLIB)
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.14.0
)
FetchContent_MakeAvailable(googletest)
add_executable(mytest test/test_foo.cpp)
target_link_libraries(mytest PRIVATE GTest::gtest_main mylib)
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBFOO REQUIRED libfoo>=1.2)
target_link_libraries(myapp PRIVATE ${LIBFOO_LIBRARIES})
target_include_directories(myapp PRIVATE ${LIBFOO_INCLUDE_DIRS})
target_compile_options(myapp PRIVATE
$<$<CONFIG:Debug>:-g -Og -fsanitize=address>
$<$<CONFIG:Release>:-O2 -DNDEBUG>
$<$<CXX_COMPILER_ID:GNU>:-fanalyzer>
$<$<CXX_COMPILER_ID:Clang>:-Weverything>
)
target_link_options(myapp PRIVATE
$<$<CONFIG:Debug>:-fsanitize=address>
)
生成器表达式:$<condition:value> 在构建时求值。
option(ENABLE_ASAN "启用 AddressSanitizer" OFF)
if(ENABLE_ASAN)
target_compile_options(myapp PRIVATE -fsanitize=address -fno-omit-frame-pointer -g -O1)
target_link_options(myapp PRIVATE -fsanitize=address)
endif()
构建命令:cmake -DENABLE_ASAN=ON -S . -B build-asan && cmake --build build-asan
# toolchain-aarch64.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_SYSROOT /opt/aarch64-sysroot)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
cmake -S . -B build-arm -DCMAKE_TOOLCHAIN_FILE=toolchain-aarch64.cmake
{
"version": 6,
"configurePresets": [
{
"name": "release",
"displayName": "Release",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/release",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
},
{
"name": "debug",
"displayName": "Debug",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"ENABLE_ASAN": "ON"
}
}
],
"buildPresets": [
{ "name": "release", "configurePreset": "release" },
{ "name": "debug", "configurePreset": "debug" }
]
}
cmake --preset release
cmake --build --preset release
| 错误 | 原因 | 修复方法 |
|---|---|---|
Could not find package Foo | 包未安装或前缀错误 | 安装开发包;设置 CMAKE_PREFIX_PATH |
No CMAKE_CXX_COMPILER | 未找到 C++ 编译器 | 安装 g++/clang++;检查 PATH |
target_link_libraries called with wrong number of arguments | 缺少 PUBLIC/PRIVATE/INTERFACE | 添加关键字 |
Cannot find source file | 拼写错误或相对路径错误 | 检查相对于 CMakeLists.txt 的路径 |
generator expression 错误 | $<> 语法错误 | 查阅 CMake 文档以了解表达式名称 |
如需完整的 CMakeLists.txt 模板,请参阅 references/templates.md。
skills/build-systems/ninja 获取 Ninja 生成器的详细信息skills/build-systems/make 获取 Make 生成器的信息skills/compilers/cross-gcc 获取交叉编译工具链设置信息skills/runtimes/sanitizers 获取消毒器集成的详细信息每周安装次数
365
代码仓库
GitHub 星标数
32
首次出现
2026年2月20日
安全审计
安装于
codex362
gemini-cli360
kimi-cli360
github-copilot360
cursor360
amp360
Guide agents through modern (target-first) CMake for C/C++ projects: out-of-source builds, dependency management, generator selection, and integration with CI and IDEs.
target_* commands.PUBLIC/PRIVATE/INTERFACE to control property propagation.include_directories() or link_libraries() (legacy).cmake_minimum_required(VERSION 3.20) for most features.cmake_minimum_required(VERSION 3.20)
project(MyApp VERSION 1.0 LANGUAGES C CXX)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(myapp
src/main.c
src/utils.c
)
target_include_directories(myapp PRIVATE include)
target_compile_options(myapp PRIVATE -Wall -Wextra)
# Static library
add_library(mylib STATIC lib/foo.c lib/bar.c)
target_include_directories(mylib
PUBLIC include # consumers get this include path
PRIVATE src # only mylib itself sees this
)
# Shared library
add_library(myshared SHARED lib/foo.c)
set_target_properties(myshared PROPERTIES
VERSION 1.0.0
SOVERSION 1
)
# Link executable against library
add_executable(myapp src/main.c)
target_link_libraries(myapp PRIVATE mylib)
# Out-of-source build (always do this)
cmake -S . -B build
cmake --build build
# With generator
cmake -S . -B build -G Ninja
cmake --build build -- -j$(nproc)
# Debug build
cmake -S . -B build-debug -DCMAKE_BUILD_TYPE=Debug
cmake --build build-debug
# Release
cmake -S . -B build-release -DCMAKE_BUILD_TYPE=Release
cmake --build build-release
# Install
cmake --install build --prefix /usr/local
Build types: Debug, Release, RelWithDebInfo, MinSizeRel.
find_package(OpenSSL REQUIRED)
target_link_libraries(myapp PRIVATE OpenSSL::SSL OpenSSL::Crypto)
find_package(Threads REQUIRED)
target_link_libraries(myapp PRIVATE Threads::Threads)
find_package(ZLIB REQUIRED)
target_link_libraries(myapp PRIVATE ZLIB::ZLIB)
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.14.0
)
FetchContent_MakeAvailable(googletest)
add_executable(mytest test/test_foo.cpp)
target_link_libraries(mytest PRIVATE GTest::gtest_main mylib)
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBFOO REQUIRED libfoo>=1.2)
target_link_libraries(myapp PRIVATE ${LIBFOO_LIBRARIES})
target_include_directories(myapp PRIVATE ${LIBFOO_INCLUDE_DIRS})
target_compile_options(myapp PRIVATE
$<$<CONFIG:Debug>:-g -Og -fsanitize=address>
$<$<CONFIG:Release>:-O2 -DNDEBUG>
$<$<CXX_COMPILER_ID:GNU>:-fanalyzer>
$<$<CXX_COMPILER_ID:Clang>:-Weverything>
)
target_link_options(myapp PRIVATE
$<$<CONFIG:Debug>:-fsanitize=address>
)
Generator expressions: $<condition:value> evaluated at build time.
option(ENABLE_ASAN "Enable AddressSanitizer" OFF)
if(ENABLE_ASAN)
target_compile_options(myapp PRIVATE -fsanitize=address -fno-omit-frame-pointer -g -O1)
target_link_options(myapp PRIVATE -fsanitize=address)
endif()
Build: cmake -DENABLE_ASAN=ON -S . -B build-asan && cmake --build build-asan
# toolchain-aarch64.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_SYSROOT /opt/aarch64-sysroot)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
cmake -S . -B build-arm -DCMAKE_TOOLCHAIN_FILE=toolchain-aarch64.cmake
{
"version": 6,
"configurePresets": [
{
"name": "release",
"displayName": "Release",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/release",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
},
{
"name": "debug",
"displayName": "Debug",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"ENABLE_ASAN": "ON"
}
}
],
"buildPresets": [
{ "name": "release", "configurePreset": "release" },
{ "name": "debug", "configurePreset": "debug" }
]
}
cmake --preset release
cmake --build --preset release
| Error | Cause | Fix |
|---|---|---|
Could not find package Foo | Package not installed or wrong prefix | Install dev package; set CMAKE_PREFIX_PATH |
No CMAKE_CXX_COMPILER | No C++ compiler found | Install g++/clang++; check PATH |
target_link_libraries called with wrong number of arguments | Missing PUBLIC/PRIVATE/INTERFACE | Add the keyword |
Cannot find source file |
For a complete CMakeLists.txt template, see references/templates.md.
skills/build-systems/ninja for Ninja generator detailsskills/build-systems/make for Make generatorskills/compilers/cross-gcc for cross-compilation toolchain setupskills/runtimes/sanitizers for sanitizer integration detailsWeekly Installs
365
Repository
GitHub Stars
32
First Seen
Feb 20, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
codex362
gemini-cli360
kimi-cli360
github-copilot360
cursor360
amp360
agent-browser 浏览器自动化工具 - Vercel Labs 命令行网页操作与测试
138,300 周安装
Rust调用关系图生成器 - 可视化函数调用层次结构,提升代码分析效率
539 周安装
parallel-web-extract:并行网页内容提取工具,高效抓取网页数据
595 周安装
腾讯云CloudBase AI模型Web技能:前端调用混元/DeepSeek模型,实现流式文本生成
560 周安装
Apollo Connectors 模式助手:GraphQL API 连接器开发与集成指南
565 周安装
GitHub Trending 趋势分析工具:实时发现热门项目、技术洞察与开源机会
556 周安装
GSAP React 集成教程:useGSAP Hook 动画库与 React 组件开发指南
546 周安装
| Typo or wrong relative path |
Check path relative to CMakeLists.txt |
generator expression error | Wrong $<> syntax | Check CMake docs for expression name |