青岛 公司 网站建设桂林最新新闻

张小明 2026/1/10 10:00:05
青岛 公司 网站建设,桂林最新新闻,个人微企业网站模板,网站将要准备建设的内容add_subdirectory() 是 CMake 中用于组织大型项目、模块化构建的核心命令#xff0c;它允许将项目分解为多个子目录#xff0c;每个子目录有自己的 CMakeLists.txt 文件。 基本语法 add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])参数详解 必需参数 source_d…add_subdirectory()是 CMake 中用于组织大型项目、模块化构建的核心命令它允许将项目分解为多个子目录每个子目录有自己的CMakeLists.txt文件。基本语法add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])参数详解必需参数source_dir作用指定包含子项目CMakeLists.txt的源目录路径规则可以是相对路径或绝对路径相对路径相对于当前CMakeLists.txt文件目录必须存在且包含CMakeLists.txt文件示例# 相对路径 add_subdirectory(src) add_subdirectory(lib/utils) # 绝对路径 add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty)可选参数binary_dir作用指定子项目的构建输出目录默认行为如果不指定CMake 会在当前构建目录下创建与source_dir同名的目录使用场景控制构建目录结构避免源目录和构建目录混合示例# 指定不同的构建目录 add_subdirectory(src build_src) add_subdirectory(lib build/libs) # 扁平化构建目录结构 add_subdirectory(apps/app1 build/app1) add_subdirectory(apps/app2 build/app2)EXCLUDE_FROM_ALL作用从默认构建目标中排除该子目录效果运行cmake --build .或make时不自动构建该子目录需要显式指定目标名构建使用场景示例代码测试工具可选组件示例# 示例代码不包含在默认构建中 add_subdirectory(examples EXCLUDE_FROM_ALL) # 测试工具需要时单独构建 add_subdirectory(tools/testgen EXCLUDE_FROM_ALL)详细用法示例基础示例简单项目结构project/ ├── CMakeLists.txt # 根 CMakeLists.txt ├── src/ │ ├── CMakeLists.txt # 源代码构建配置 │ ├── main.cpp │ └── utils.cpp ├── include/ │ └── utils.h └── tests/ ├── CMakeLists.txt # 测试配置 └── test_utils.cpp根目录 CMakeLists.txt:cmake_minimum_required(VERSION 3.10) project(MyProject VERSION 1.0.0) # 添加子目录 add_subdirectory(src) add_subdirectory(tests)src/CMakeLists.txt:# 子目录中的配置是独立的 add_library(mylib STATIC utils.cpp) add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE mylib) target_include_directories(mylib PUBLIC ../include)多级嵌套# 根目录 cmake_minimum_required(VERSION 3.14) project(EnterpriseApp) # 一级子目录 add_subdirectory(core) # 核心模块 add_subdirectory(ui) # 用户界面 add_subdirectory(services) # 服务层 add_subdirectory(tests) # 测试 # core/CMakeLists.txt add_subdirectory(base) # 基础组件 add_subdirectory(data) # 数据层 add_subdirectory(logic) # 业务逻辑条件性添加子目录# 根据选项添加子目录 option(BUILD_TESTS 构建测试 ON) option(BUILD_EXAMPLES 构建示例 OFF) option(BUILD_TOOLS 构建工具 ON) if(BUILD_TESTS) add_subdirectory(tests) endif() if(BUILD_EXAMPLES) add_subdirectory(examples EXCLUDE_FROM_ALL) endif() if(BUILD_TOOLS) add_subdirectory(tools) endif() # 根据平台添加 if(UNIX AND NOT APPLE) add_subdirectory(linux) elseif(WIN32) add_subdirectory(win32) elseif(APPLE) add_subdirectory(macos) endif()作用域和变量传递变量作用域规则默认情况下变量是向下传递的父→子变量不是向上传递的子→父除非使用PARENT_SCOPE每个子目录有独立的变量作用域# 父目录 CMakeLists.txt set(PARENT_VAR 父变量值) set(CACHE_VAR 缓存值 CACHE STRING 缓存变量) add_subdirectory(child) # 在父作用域中无法访问子目录的变量 message(子变量: ${CHILD_VAR}) # 空 # child/CMakeLists.txt message(父变量: ${PARENT_VAR}) # 输出: 父变量值 message(缓存变量: ${CACHE_VAR}) # 输出: 缓存值 set(CHILD_VAR 子变量值) # 只在子作用域有效 set(PARENT_VAR 修改父变量) # 只修改子作用域中的副本 set(RESULT 需要返回的值 PARENT_SCOPE) # 设置到父作用域向子目录传递参数# 方法1使用缓存变量 set(BUILD_TYPE Release CACHE STRING 构建类型) add_subdirectory(lib) # 方法2使用 set(... PARENT_SCOPE) 在子目录中设置 # 方法3使用函数参数风格通过缓存变量模拟 # lib/CMakeLists.txt if(NOT DEFINED BUILD_TYPE) set(BUILD_TYPE Debug CACHE STRING 构建类型) endif() message(STATUS lib 构建类型: ${BUILD_TYPE})从子目录获取结果# 父目录 CMakeLists.txt set(COLLECTED_TARGETS ) add_subdirectory(module1) add_subdirectory(module2) message(STATUS 所有目标: ${COLLECTED_TARGETS}) # module1/CMakeLists.txt add_library(module1 STATIC src1.cpp) set(COLLECTED_TARGETS ${COLLECTED_TARGETS};module1 PARENT_SCOPE) # module2/CMakeLists.txt add_library(module2 STATIC src2.cpp) set(COLLECTED_TARGETS ${COLLECTED_TARGETS};module2 PARENT_SCOPE)构建目录管理控制构建输出结构# 选项1保持源目录结构 add_subdirectory(src build/src) add_subdirectory(lib build/lib) add_subdirectory(tests build/tests) # 选项2扁平化结构 add_subdirectory(src/core build/core) add_subdirectory(src/gui build/gui) add_subdirectory(src/utils build/utils) # 选项3按类型组织 add_subdirectory(libs/math build/lib) add_subdirectory(libs/network build/lib) add_subdirectory(apps/tool1 build/bin) add_subdirectory(apps/tool2 build/bin)分离源目录和构建目录# out-of-source 构建最佳实践 # 假设项目结构 # /project/source/CMakeLists.txt # /project/source/src/... # /project/build/ (空目录) # 在 /project/build/ 中运行 # cmake ../source # source/CMakeLists.txt add_subdirectory(src ${CMAKE_BINARY_DIR}/src_build) add_subdirectory(lib ${CMAKE_BINARY_DIR}/lib_build) # 这样源目录保持干净所有生成文件在 build 目录高级用法动态添加子目录# 根据文件存在性添加子目录 if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/optional) add_subdirectory(optional) endif() # 根据配置添加 set(SUPPORTED_MODULES core;gui;network) foreach(module IN LISTS SUPPORTED_MODULES) set(module_dir ${CMAKE_CURRENT_SOURCE_DIR}/modules/${module}) if(EXISTS ${module_dir}/CMakeLists.txt) message(STATUS 添加模块: ${module}) add_subdirectory(${module_dir} ${CMAKE_BINARY_DIR}/modules/${module}) else() message(WARNING 模块 ${module} 不存在) endif() endforeach()递归包含所有子目录# 自动包含所有包含 CMakeLists.txt 的子目录 macro(add_all_subdirectories root_dir) file(GLOB children RELATIVE ${root_dir} ${root_dir}/*) foreach(child ${children}) set(child_path ${root_dir}/${child}) if(IS_DIRECTORY ${child_path}) if(EXISTS ${child_path}/CMakeLists.txt) message(STATUS 添加子目录: ${child}) add_subdirectory(${child_path}) endif() endif() endforeach() endmacro() # 使用 add_all_subdirectories(${CMAKE_CURRENT_SOURCE_DIR})使用 include() 替代 add_subdirectory()# 有时 include() 更适合简单的模块化 # 区别 # - add_subdirectory(): 创建新作用域适合独立模块 # - include(): 在当前作用域执行适合共享配置 # 共享配置模块 include(cmake/CompilerFlags.cmake) include(cmake/PlatformSettings.cmake) include(cmake/FindDependencies.cmake) # 然后添加子目录 add_subdirectory(src)处理循环依赖# 方案1提取公共部分 # 创建公共库 add_subdirectory(common) # 包含 shared_utils # 其他模块依赖公共库 add_subdirectory(module1) add_subdirectory(module2) # module1/CMakeLists.txt add_library(module1 module1.cpp) target_link_libraries(module1 PRIVATE common_lib) # module2/CMakeLists.txt add_library(module2 module2.cpp) target_link_libraries(module2 PRIVATE common_lib module1) # 允许单向依赖 # 方案2使用接口库 add_library(interface_lib INTERFACE) add_subdirectory(module_a) # 使用 interface_lib add_subdirectory(module_b) # 使用 interface_lib实际项目示例示例1企业级项目结构# 根目录 CMakeLists.txt cmake_minimum_required(VERSION 3.16) project(EnterprisePlatform VERSION 2.5.0) # 设置全局选项 option(BUILD_SHARED_LIBS 构建共享库 ON) option(ENABLE_TESTS 启用测试 ON) option(ENABLE_BENCHMARKS 启用性能测试 OFF) # 包含配置模块 include(cmake/CompilerSettings.cmake) include(cmake/PlatformConfig.cmake) # 添加第三方依赖 add_subdirectory(thirdparty) # 添加核心模块 add_subdirectory(core) add_subdirectory(framework) # 添加业务模块 add_subdirectory(modules/auth) add_subdirectory(modules/database) add_subdirectory(modules/messaging) # 添加应用程序 add_subdirectory(apps/server) add_subdirectory(apps/client) # 添加测试可选 if(ENABLE_TESTS) add_subdirectory(tests) endif() # 添加工具 add_subdirectory(tools EXCLUDE_FROM_ALL)示例2库项目结构# 数学库项目 cmake_minimum_required(VERSION 3.14) project(MathLibrary VERSION 3.2.0 LANGUAGES CXX) # 设置输出目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # 添加库模块 add_subdirectory(src/algebra) # 代数模块 add_subdirectory(src/calculus) # 微积分模块 add_subdirectory(src/statistics) # 统计模块 add_subdirectory(src/optimization) # 优化模块 # 创建聚合库目标 add_library(mathlib INTERFACE) target_link_libraries(mathlib INTERFACE algebra calculus statistics optimization ) # 添加示例 add_subdirectory(examples EXCLUDE_FROM_ALL) # 添加测试 if(BUILD_TESTING) enable_testing() add_subdirectory(tests) endif() # 安装配置 include(GNUInstallDirs) install(TARGETS mathlib EXPORT mathlib-targets) install(EXPORT mathlib-targets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/mathlib )示例3跨平台应用# 游戏引擎项目 cmake_minimum_required(VERSION 3.18) project(GameEngine VERSION 0.1.0) # 平台检测和设置 if(WIN32) set(ENGINE_PLATFORM Windows) add_subdirectory(platform/win32) elseif(APPLE) set(ENGINE_PLATFORM macOS) add_subdirectory(platform/macos) elseif(UNIX) set(ENGINE_PLATFORM Linux) add_subdirectory(platform/linux) else() message(FATAL_ERROR 不支持的平台) endif() # 核心引擎模块 add_subdirectory(engine/core) # 核心系统 add_subdirectory(engine/graphics) # 图形模块 add_subdirectory(engine/audio) # 音频模块 add_subdirectory(engine/physics) # 物理模块 add_subdirectory(engine/scripting) # 脚本系统 # 工具模块 add_subdirectory(tools/editor) # 编辑器 add_subdirectory(tools/converter) # 资源转换器 add_subdirectory(tools/debugger) # 调试工具 # 示例游戏 option(BUILD_SAMPLES 构建示例游戏 ON) if(BUILD_SAMPLES) add_subdirectory(samples/demo_game) add_subdirectory(samples/test_game EXCLUDE_FROM_ALL) endif() # 测试框架 if(BUILD_TESTS) add_subdirectory(tests/unit_tests) add_subdirectory(tests/integration_tests) endif()最佳实践1.清晰的目录结构# 推荐结构 project/ ├── CMakeLists.txt # 根配置 ├── cmake/ # CMake 模块 │ ├── FindPackages.cmake │ └── Utils.cmake ├── src/ # 主源代码 │ ├── CMakeLists.txt │ ├── core/ │ ├── gui/ │ └── utils/ ├── include/ # 公共头文件 ├── libs/ # 内部库 │ ├── mathlib/CMakeLists.txt │ └── network/CMakeLists.txt ├── apps/ # 应用程序 │ ├── app1/CMakeLists.txt │ └── app2/CMakeLists.txt ├── tests/ # 测试 ├── examples/ # 示例代码 └── thirdparty/ # 第三方依赖 └── CMakeLists.txt2.合理的变量管理# 在根目录设置全局变量 set(PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) set(BUILD_OUTPUT ${CMAKE_BINARY_DIR}/output) # 子目录可以使用这些变量 # src/CMakeLists.txt set(SOURCE_DIR ${PROJECT_ROOT}/src) set(OUTPUT_DIR ${BUILD_OUTPUT}/src)3.避免深度嵌套# 不推荐深度嵌套 add_subdirectory(module/submodule/deep/nested) # 推荐扁平化或适度嵌套 add_subdirectory(module_submodule_deep_nested) # 或 add_subdirectory(module) # 在 module/CMakeLists.txt 中 add_subdirectory(submodule)4.处理依赖关系# 明确声明依赖顺序 add_subdirectory(base) # 基础库无依赖 add_subdirectory(utils) # 工具库依赖 base add_subdirectory(core) # 核心模块依赖 base 和 utils add_subdirectory(app) # 应用程序依赖所有 # 在子目录 CMakeLists.txt 中 # utils/CMakeLists.txt target_link_libraries(utils PUBLIC base)常见问题和解决方案问题1变量未传递# 问题子目录看不到父目录的变量 set(MY_FLAG VALUE) add_subdirectory(child) # child/CMakeLists.txt 中看不到 MY_FLAG # 解决方案1使用缓存变量 set(MY_FLAG VALUE CACHE STRING 我的标志) # 解决方案2在子目录中重新定义 # child/CMakeLists.txt if(NOT DEFINED MY_FLAG) set(MY_FLAG DEFAULT) endif()问题2目标名冲突# 问题不同子目录中同名目标 # src/CMakeLists.txt add_library(utils STATIC ...) # tests/CMakeLists.txt add_library(utils STATIC ...) # 冲突 # 解决方案使用命名空间 # src/CMakeLists.txt add_library(src_utils STATIC ...) # tests/CMakeLists.txt add_library(test_utils STATIC ...)问题3循环依赖检测# CMake 会检测到循环依赖并报错 # 错误add_subdirectory 添加了当前目录 # 正确避免自我包含 if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL ${sub_dir}) add_subdirectory(${sub_dir}) endif()问题4相对路径错误# 问题在嵌套子目录中使用错误路径 # project/src/module/CMakeLists.txt include(../../cmake/utils.cmake) # 可能工作但不健壮 # 解决方案使用 CMAKE_CURRENT_SOURCE_DIR include(${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/utils.cmake) # 更好的方案在根目录设置变量 # 根目录 CMakeLists.txt set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) # 任何子目录中都可以 include(utils)调试技巧跟踪执行流程# 在根目录 CMakeLists.txt message(STATUS 进入根目录: ${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory(module1) message(STATUS 返回根目录) # module1/CMakeLists.txt message(STATUS 进入 module1: ${CMAKE_CURRENT_SOURCE_DIR}) # 输出 # -- 进入根目录: /path/to/project # -- 进入 module1: /path/to/project/module1 # -- 返回根目录检查目录存在性macro(safe_add_subdirectory dir) if(NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${dir}) message(WARNING 目录不存在: ${dir}) return() endif() if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/CMakeLists.txt) message(WARNING CMakeLists.txt 不存在于: ${dir}) return() endif() message(STATUS 添加子目录: ${dir}) add_subdirectory(${dir}) endmacro() # 使用 safe_add_subdirectory(src) safe_add_subdirectory(optional_module)分析构建树# 打印项目结构 function(print_project_structure indent dir) file(GLOB entries LIST_DIRECTORIES true RELATIVE ${dir} ${dir}/*) foreach(entry ${entries}) set(full_path ${dir}/${entry}) if(IS_DIRECTORY ${full_path}) message(STATUS ${indent}├── ${entry}/) if(EXISTS ${full_path}/CMakeLists.txt) print_project_structure(${indent}│ ${full_path}) endif() endif() endforeach() endfunction() # 在根目录调用 print_project_structure( ${CMAKE_SOURCE_DIR})add_subdirectory()是 CMake 项目管理的基础合理使用可以创建清晰、可维护的大型项目结构。掌握其作用域规则和变量传递机制对于构建复杂项目至关重要。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站的公司图服务商平台

鸽子蛋 vs ANcHuN蛋(鹌鹑蛋)——核心差异一句话: “鸽子蛋更大、更贵、单位胆固醇高;鹌鹑蛋迷你、便宜、铁和核黄素更突出,两者蛋白质质量相当,按‘性价比’选鹌鹑,按‘口感/送礼’选鸽子。” 1…

张小明 2026/1/9 23:59:44 网站建设

学校没有网站wordpress加速插件

在很多 ABAP 项目里,你总能看到类似写法:调用完某个 BAPI_* 函数模块,就顺手来一句 COMMIT WORK,仿佛这就是事务提交的标准姿势。代码看起来没毛病,短期也不一定出事,可一旦你把多个 BAPI 串起来做批处理、或者在失败后继续调用后续 BAPI,就可能掉进一种非常隐蔽的坑:数…

张小明 2026/1/10 22:51:58 网站建设

怎么创建免费网站吗长春网络公司排名

百度文库助手:零基础快速下载文档的完整指南 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 百度文库助手是一款专门针对百度文库设计的实用工具,能够帮助用户免费获取文库…

张小明 2026/1/10 13:24:54 网站建设

建立网站官网做外贸网站费用

Python 多线程详解 1. 多线程的概念 在 Python 中,多线程是指在一个进程内同时运行多个线程,以便在某些场景下提升程序的响应能力或并发性。 线程是 CPU 调度的最小单位,而进程是系统资源分配的最小单位。一个进程可以包含多个线程&#xff0…

张小明 2026/1/10 23:11:42 网站建设

宁波高端网站设计公司虹桥街道网站建设

YOLO模型压缩技术揭秘:如何在低算力设备上运行?在智能摄像头、工业质检仪、农业无人机等边缘设备日益普及的今天,一个共同的挑战摆在开发者面前:如何让像YOLO这样高性能的目标检测模型,在只有几百MB内存和有限算力的小…

张小明 2026/1/9 19:53:37 网站建设

怎样才能访问没有备案的网站只建设电子商务网站不维护

yshop意象商城:全栈电商平台架构解析与实战部署指南 【免费下载链接】yshopmall yshop基于当前流行技术组合的前后端分离商城系统: SpringBoot2MybatisPlusSpringSecurityjwtredisVue的前后端分离的商城系统, 包含商城、sku、运费模板、素材库…

张小明 2026/1/7 11:56:18 网站建设