珠海响应式网站建设价格wordpress 登录404
2026/4/16 22:18:00 网站建设 项目流程
珠海响应式网站建设价格,wordpress 登录404,公司取名网,沈阳市网站设计制作公司一、常用 CMake 内置全局变量总表#xff08;工程实践版#xff09; 1️⃣ 项目与目录相关#xff08;最常用#xff09; 变量名含义典型使用场景PROJECT_NAME项目名打印日志、命名 targetPROJECT_SOURCE_DIR顶层源码目录引用源码路径PROJECT_BINARY_DIR顶层构建目录生成…一、常用 CMake 内置全局变量总表工程实践版1️⃣ 项目与目录相关最常用变量名含义典型使用场景PROJECT_NAME项目名打印日志、命名 targetPROJECT_SOURCE_DIR顶层源码目录引用源码路径PROJECT_BINARY_DIR顶层构建目录生成文件路径CMAKE_SOURCE_DIR最顶层 CMakeLists 所在目录多子项目判断CMAKE_BINARY_DIR最顶层 build 目录全局输出路径CMAKE_CURRENT_SOURCE_DIR当前 CMakeLists 目录子目录相对路径CMAKE_CURRENT_BINARY_DIR当前子目录 build 目录生成中间文件使用频率极高所有 CMake 项目必用2️⃣ 编译器与语言相关变量名含义使用场景CMAKE_C_COMPILERC 编译器路径判断 gcc / clangCMAKE_CXX_COMPILERC 编译器路径同上CMAKE_C_COMPILER_ID编译器类型GNU / Clang / MSVCCMAKE_CXX_COMPILER_IDC 编译器类型条件分支CMAKE_CXX_COMPILER_VERSION编译器版本特性判断CMAKE_CXX_STANDARDC 标准推荐方式CMAKE_CXX_FLAGS全局 C 编译参数老项目常见示例if (CMAKE_CXX_COMPILER_ID STREQUAL GNU) add_compile_options(-Wall) endif()3️⃣ 构建类型相关Debug / Release变量名含义使用场景CMAKE_BUILD_TYPE构建类型单配置生成器CMAKE_CXX_FLAGS_DEBUGDebug 编译参数调试CMAKE_CXX_FLAGS_RELEASERelease 编译参数性能CMAKE_CONFIGURATION_TYPES多配置类型VS / Xcode⚠️ 注意Makefile / Ninja用CMAKE_BUILD_TYPEVisual Studio忽略CMAKE_BUILD_TYPE4️⃣ 平台 / 系统 / 架构相关跨平台必用变量名含义使用场景CMAKE_SYSTEM_NAME操作系统Linux / WindowsCMAKE_SYSTEM_PROCESSOR架构x86_64 / aarch64UNIX是否类 Unix条件判断WIN32是否 Windows条件判断APPLE是否 Apple 平台macOS/iOSCMAKE_SIZEOF_VOID_P指针大小32/64 位判断示例if (CMAKE_SIZEOF_VOID_P EQUAL 8) message(STATUS 64-bit build) endif()5️⃣ 输出、安装、路径相关部署必用变量名含义使用场景CMAKE_INSTALL_PREFIX安装前缀make installCMAKE_RUNTIME_OUTPUT_DIRECTORYexe 输出路径bin 统一CMAKE_LIBRARY_OUTPUT_DIRECTORYso 输出路径lib 统一CMAKE_ARCHIVE_OUTPUT_DIRECTORYa 输出路径lib 统一CMAKE_PREFIX_PATH查找依赖前缀find_packageCMAKE_MODULE_PATH自定义 Find*.cmake第三方库6️⃣ Generator / 构建系统相关变量名含义使用场景CMAKE_GENERATOR生成器类型Ninja / MakeCMAKE_MAKE_PROGRAMmake 程序路径自动化CMAKE_TOOLCHAIN_FILE工具链文件交叉编译7️⃣ CMake 自身行为控制高级变量名含义使用场景CMAKE_VERBOSE_MAKEFILE显示详细命令调试CMAKE_EXPORT_COMPILE_COMMANDS生成 compile_commands.jsonclangdCMAKE_POLICY_DEFAULT_CMPxxxx策略控制老项目兼容二、CMake常见命令一、项目与基本配置类Project / Configure命令作用典型使用场景cmake_minimum_required()指定最低 CMake 版本每个项目必须project()定义项目名、版本、语言项目入口set()设置变量设置选项、路径option()定义 ON/OFF 开关是否开启测试、功能message()打印信息调试 CMakeinclude()引入模块引入 GNUInstallDirsif() / elseif() / else()条件判断平台/编译器分支foreach()循环批量处理目标cmake_policy()设置策略新旧行为兼容二、目标Target定义类核心命令作用使用说明add_library()定义库静态 / 动态 / 接口库add_executable()定义可执行文件主程序add_custom_target()自定义目标生成文件、脚本add_custom_command()自定义命令代码生成add_dependencies()目标依赖控制构建顺序add_library(ALIAS)别名 target导出库必备三、Target 属性设置现代 CMake 核心命令作用推荐级别target_link_libraries()链接库⭐⭐⭐⭐⭐target_include_directories()头文件路径⭐⭐⭐⭐⭐target_compile_definitions()宏定义⭐⭐⭐⭐⭐target_compile_options()编译参数⭐⭐⭐⭐target_compile_features()语言特性⭐⭐⭐⭐⭐set_target_properties()设置属性⭐⭐⭐get_target_property()查询属性⭐⭐四、源码与文件处理命令作用使用说明target_sources()添加源文件动态拆分源码file()文件操作读/写/拷贝configure_file()配置头文件生成 config.haux_source_directory()收集源码❌ 不推荐source_group()IDE 分组VS/CLion五、第三方库与依赖管理命令作用场景find_package()查找已安装库系统/包管理器FetchContent_Declare()声明依赖拉取源码FetchContent_MakeAvailable()引入依赖现代方式find_library()查找库文件不推荐find_path()查找头文件不推荐pkg_check_modules()pkg-configLinux 库六、构建控制与生成器命令作用说明add_subdirectory()添加子目录模块化项目enable_language()启用语言Fortran / CUDAset_property()设置属性高级用法get_property()获取属性调试七、安装install / export / package命令作用场景install()安装目标make installexport()导出 targetsbuild-tree 使用install(EXPORT)安装 targetspackageconfigure_package_config_file()生成 Config.cmakefind_packagewrite_basic_package_version_file()生成版本文件版本管理include(GNUInstallDirs)标准目录/usr/lib八、测试CTest命令作用使用说明enable_testing()启用测试顶层add_test()注册测试单元测试ctest运行测试CI九、编译器 / 平台判断常用变量 命令命令 / 变量作用CMAKE_CXX_COMPILER_ID编译器类型CMAKE_SYSTEM_NAME系统名CMAKE_BUILD_TYPE构建类型CMAKE_SIZEOF_VOID_P32/64 位WIN32 / UNIX / APPLE平台宏十、调试 排错非常实用命令作用message(STATUS ...)打印状态cmake -LA查看 cachecmake --trace跟踪执行cmake --trace-expand展开变量make VERBOSE1查看真实命令十一、反模式应避免命令问题CMAKE_CXX_FLAGS全局污染include_directories()不可控link_libraries()隐式依赖aux_source_directory()不稳定十二、“必会命令清单”如果只记10 个project add_library add_executable target_link_libraries target_include_directories target_compile_features add_subdirectory find_package install configure_package_config_file三、CMakeLists与CMakeCache(1、CMakeLists.txt 定义CMakeLists.txt是 CMake 的“源代码文件”是由项目维护者编写。描述内容包括项目结构、如何编译使用的编译器/标准依赖哪些库生成哪些目标exe / so / a。 本质构建规则说明书 特点必须存在否则无法使用 CMake可以有多个每个子目录一个会被反复解析不保存状态每次配置都从头执行 举例project(MyApp LANGUAGES C CXX) add_executable(myapp main.cpp) target_compile_features(myapp PRIVATE cxx_std_17) target_link_libraries(myapp PRIVATE pthread)(2)、CMakeCache.txt 定义CMakeCache.txt是 CMake 的“配置结果缓存文件”。是由CMake 自动生成位于build 目录。其内容是记录已选择的编译器、构建类型、路径、用户/脚本设置的 cache 变量 本质一次配置的“结果快照” 特点不是手写出来的只在第一次 cmake 配置或 cache 改变时更新决定“这次 build 实际用什么配置” 举例CMAKE_CXX_COMPILER:FILEPATH/usr/bin/g CMAKE_BUILD_TYPE:STRINGRelease CMAKE_INSTALL_PREFIX:PATH/usr/local(3)、两者的关系CMakeLists.txt 负责“怎么算”CMakeCache.txt 负责“算完后的结果记住”。CMakeLists.txt 程序代码CMakeCache.txt 程序运行后的变量存储CMakeLists.txt ↓解析 cmake 配置 ↓计算变量 CMakeCache.txt写入 ↓ 生成 Makefile / Ninja / VS 工程(4)、CACHE 变量机制1️⃣ 普通变量不进 cacheset(FOO 123)只在当前配置过程中存在下次 cmake 就没了2️⃣ Cache 变量写入 CMakeCache.txtset(FOO 123 CACHE STRING demo variable)写入CMakeCache.txt下次 cmake 直接读取用户可通过-D修改3️⃣FORCE的影响set(CMAKE_CXX_FLAGS ... CACHE STRING FORCE)强制覆盖 cache用户无法修改常见于老项目技术债(5)、生命周期对比项目CMakeLists.txtCMakeCache.txt谁创建人写CMake 自动生成是否可版本管理✔️ 是❌ 否是否可删除❌✔️安全是否参与逻辑✔️❌是否保存状态❌✔️修改是否推荐✔️❌(6)、最常见误区❌ 误区 1改了 CMakeLists.txt但结果没变原因值已在CMakeCache.txt中存在被 cache 覆盖解决rm -rf build cmake ..❌ 误区 2改 cache 当改源码直接编辑CMakeCache.txt短期“好像有用”下次 cmake 可能被覆盖不可维护❌ 误区 3不知道编译器“被锁死”了一旦第一次配置选择了编译器CMAKE_CXX_COMPILER/usr/bin/g后续CCclang CXXclang cmake ..无效除非清 cache(7)、工程实践总结CMakeLists.txt 是规则必须可读、可维护CMakeCache.txt 是状态可删不可改遇到“CMake 怎么都不生效”删 build 目录不要在 CMakeLists.txt 里滥用set(... CACHE ... FORCE)CMakeLists.txt 决定“应该怎么构建”CMakeCache.txt 记录“这次到底怎么构建了”。四、CMakeLists实例一、示例项目目录结构my_project/ ├── CMakeLists.txt # 顶层 ├── cmake/ │ └── toolchain-clang.cmake # 可选 ├── src/ │ ├── main.cpp │ ├── math/ │ │ ├── add.cpp │ │ └── add.h │ └── CMakeLists.txt ├── include/ │ └── my_project/ │ └── config.h ├── tests/ │ ├── test_add.cpp │ └── CMakeLists.txt └── README.md二、顶层CMakeLists.txt核心文件cmake_minimum_required(VERSION 3.16) # 1️⃣ 项目定义 project( MyProject VERSION 1.0.0 LANGUAGES C CXX ) # 2️⃣ C 标准全局约束不是 flags set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 3️⃣ 常用构建选项 option(ENABLE_TESTS Build tests ON) option(ENABLE_WARNINGS Enable compiler warnings ON) # 4️⃣ 编译器相关设置只放“安全判断” if (ENABLE_WARNINGS) if (MSVC) add_compile_options(/W4) else() add_compile_options(-Wall -Wextra -Wpedantic) endif() endif() # 5️⃣ 添加子目录 add_subdirectory(src) if (ENABLE_TESTS) enable_testing() add_subdirectory(tests) endif()三、src/CMakeLists.txt业务代码# 1️⃣ 创建库推荐先库后程序 add_library(my_math math/add.cpp ) # 2️⃣ 头文件路径PUBLIC 会传递 target_include_directories(my_math PUBLIC ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src ) # 3️⃣ 编译特性比 set(CMAKE_CXX_STANDARD) 更精细 target_compile_features(my_math PUBLIC cxx_std_17) # 4️⃣ 可执行程序 add_executable(my_app main.cpp ) # 5️⃣ 链接库 target_link_libraries(my_app PRIVATE my_math )四、tests/CMakeLists.txt单元测试add_executable(test_add test_add.cpp ) target_link_libraries(test_add PRIVATE my_math ) add_test( NAME test_add COMMAND test_add )五、示例源码最小可跑src/main.cpp#include iostream #include math/add.h int main() { std::cout add(2, 3) std::endl; return 0; }src/math/add.h#pragma once int add(int a, int b);src/math/add.cpp#include math/add.h int add(int a, int b) { return a b; }六、构建方式mkdir build cd build cmake .. \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_CXX_COMPILERclang cmake --build . ctest七、这个示例里“正确做了什么”✅ 1️⃣ 没有使用CMAKE_CXX_FLAGS# ❌ 没有 set(CMAKE_CXX_FLAGS ...) # ✅ 使用 target_compile_options() target_compile_features()✅ 2️⃣ 库 / 可执行分离业务逻辑 →add_library程序入口 →add_executable这是大型项目必备结构✅ 3️⃣ include 目录是 target 级别target_include_directories(my_math PUBLIC ...)不会污染全局✅ 4️⃣ 测试是可选的option(ENABLE_TESTS ON)适合 CI / Release 裁剪八、一个“反例”❌ 不推荐的 CMakeListsset(CMAKE_CXX_FLAGS -stdc11 -O2) include_directories(include) link_libraries(mylib)原因全局污染不可维护多 target 会炸

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询