CMake实战:如何优雅地管理你的项目输出路径(含Debug/Release区分)

告别配置焦虑:用CMake和QTCreator 5.12一站式搞定QSSH库集成(Debug/Release双模式) 本文详细介绍了如何使用CMake和QTCreator 5.12高效集成QSSH库,支持Debug/Release双模式。通过源码级集成和智能链接配置,开发者可以避免手动配置的繁琐问题,提升开发效率和项目可维护性。文章还提供了环境准备、构建配置管理和调试技巧等实用指南,帮助开发者快速掌握现代CMake实践。 阅读详情

CMake实战:如何优雅地管理你的项目输出路径(含Debug/Release区分)

你是否也曾面对过构建目录下那一堆杂乱无章的可执行文件、静态库和动态库而感到头疼?尤其是在团队协作中,当Debug版本和Release版本的文件混在一起,或者不同平台的构建产物散落在各处时,那种混乱感足以让任何一位追求整洁的开发者抓狂。CMake作为现代C/C++项目构建的事实标准,其强大之处不仅在于跨平台,更在于它提供了精细控制项目构建生命周期的能力。然而,默认的构建输出行为往往过于“自由”,不符合中大型项目对结构化和可预测性的要求。

这篇文章正是为你——一位已经熟悉CMake基础语法,但渴望将项目构建管理提升到“工程级”水准的开发者——准备的。我们将深入探讨如何通过CMake的变量和属性,系统地规划你的输出目录,实现Debug与Release版本的清晰隔离,并优雅地处理安装与部署流程。这不仅仅是几条命令的堆砌,而是一套关于构建“美学”和工程实践的方法论。

1. 理解CMake的输出路径逻辑:从混乱到秩序

在开始动手配置之前,我们必须先理解CMake默认的输出行为,以及为什么我们需要干预它。默认情况下,当你执行cmake --build时,生成的目标文件(可执行文件、库文件)会被放置在CMAKE_CURRENT_BINARY_DIR的子目录中,这个目录通常与你的源码结构对应。例如,在src/目录下的CMakeLists.txt中定义的add_executable(myapp),其输出路径可能是<build_dir>/src/myapp或<build_dir>/src/<config>/myapp(取决于生成器)。

这种默认行为在小项目或快速原型中没问题,但一旦项目规模扩大,或者需要同时维护Debug、Release、RelWithDebInfo等多种构建配置时,问题就来了。所有配置的产物都堆在同一个目录下,或者分散在带有配置名的子目录里,但库文件和可执行文件依然混在一起,不利于后续的打包、测试和分发。

CMake提供了几个关键的**变量(Variables)和目标属性(Target Properties)**来控制输出路径:

  • EXECUTABLE_OUTPUT_PATH (已过时但常见):全局变量,设置所有后续可执行文件的输出目录。
  • LIBRARY_OUTPUT_PATH (已过时但常见):全局变量,设置所有后续库文件(静态和动态)的输出目录。
  • CMAKE_RUNTIME_OUTPUT_DIRECTORY:更现代的全局变量,影响所有目标的运行时产物(即可执行文件和动态库的.dll/.so/.dylib文件)。
  • CMAKE_LIBRARY_OUTPUT_DIRECTORY:全局变量,影响所有目标的动态库(共享库)文件。
  • CMAKE_ARCHIVE_OUTPUT_DIRECTORY:全局变量,影响所有目标的静态库(归档文件,如.a或.lib)文件。
  • RUNTIME_OUTPUT_DIRECTORY (目标属性):针对单个目标,设置其运行时产物的输出目录。
  • LIBRARY_OUTPUT_DIRECTORY (目标属性):针对单个目标,设置其动态库文件的输出目录。
  • ARCHIVE_OUTPUT_DIRECTORY (目标属性):针对单个目标,设置其静态库文件的输出目录。

注意:以CMAKE_开头的全局变量通常在CMakeLists.txt的顶层设置,会影响之后定义的所有目标。而为单个目标设置的属性优先级更高,可以覆盖全局设置。现代CMake(3.x+)更推荐使用目标属性进行精细控制。

理解这些变量和属性的作用域与优先级,是构建清晰输出策略的第一步。接下来,我们将构建一个具体的目录结构方案。

2. 构建多配置的清晰输出目录结构

一个理想的、易于管理的输出目录结构应该满足几个条件:1) 按构建类型(Debug/Release等)分离;2) 按产物类型(可执行文件、动态库、静态库)分离;3) 便于查找和引用。下面是一个我经过多个项目实践后总结的推荐结构:

<project_root>/
├── CMakeLists.txt
├── src/
│   └── ...
├── include/
│   └── ...
└── build/                    # 通常的构建目录,由开发者创建
    └── output/               # 我们统一控制的最终产物输出根目录
        ├── Debug/
        │   ├── bin/          # 存放所有Debug版的可执行文件(.exe)和动态库(.dll)
        │   ├── lib/          # 存放所有Debug版的静态库(.lib/.a)和动态库的导入库(.lib)
        │   └── plugins/      # 可选,存放Debug版的插件
        └── Release/
            ├── bin/          # 存放所有Release版的可执行文件和动态库
            ├── lib/          # 存放所有Release版的静态库和导入库
            └── plugins/      # 可选,存放Release版的插件

为了实现这个结构,我们需要在顶层的CMakeLists.txt中进行全局设置。一个常见的做法是,在project()命令之后,立即根据构建类型设置基础路径。

# 设置项目名称和版本
cmake_minimum_required(VERSION 3.15)
project(MyAwesomeProject VERSION 1.0.0)

# 定义输出根目录。这里选择在构建目录内创建一个`output`文件夹。
# 你也可以选择输出到项目源码树外的其他位置。
set(PROJECT_OUTPUT_ROOT "${CMAKE_BINARY_DIR}/output")

# 根据当前构建类型(由CMAKE_BUILD_TYPE或多配置生成器决定)设置子目录
# 注意:对于Visual Studio等多配置生成器,这个变量在配置阶段可能为空。
# 更通用的做法是稍后通过生成器表达式(Generator Expressions)来处理。
string(TOLOWER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_LOWER)
if(NOT BUILD_TYPE_LOWER)
    set(BUILD_TYPE_LOWER "debug") # 默认值
endif()

set(OUTPUT_BIN_DIR "${PROJECT_OUTPUT_ROOT}/${BUILD_TYPE_LOWER}/bin")
set(OUTPUT_LIB_DIR "${PROJECT_OUTPUT_ROOT}/${BUILD_TYPE_LOWER}/lib")

# 设置全局输出目录变量
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_BIN_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_LIB_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_LIB_DIR})

# 确保目录存在
file(MAKE_DIRECTORY ${OUTPUT_BIN_DIR})
file(MAKE_DIRECTORY ${OUTPUT_LIB_DIR})

然而,上面的方法对于Visual Studio、Xcode这类多配置生成器(Multi-Config Generators)并不完全奏效,因为CMAKE_BUILD_TYPE在这些生成器中是未定义的。CMake为这种情况提供了强大的生成器表达式(Generator Expressions)。这是实现真正优雅、通用配置的关键。

# 更健壮和通用的设置方式,适用于所有生成器
set(PROJECT_OUTPUT_ROOT "${CMAKE_BINARY_DIR}/output")

# 使用生成器表达式,为每种配置类型指定不同的路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_OUTPUT_ROOT}/$<CONFIG>/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_OUTPUT_ROOT}/$<CONFIG>/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_OUTPUT_ROOT}/$<CONFIG>/lib")

# $<CONFIG> 生成器表达式会在构建时被替换为实际的配置名,如Debug, Release, RelWithDebInfo等。

通过这种方式,无论你使用make(单配置)还是msbuild/xcodebuild(多配置),CMake都能正确地将不同构建类型的产物输出到对应的bin和lib目录下。

3. 高级技巧:区分Debug与Release版本的文件名

仅仅把文件放在不同的文件夹里,有时还不够。例如,当你需要将多个配置的库文件临时放在同一个目录下进行测试,或者某些工具链对查找库文件有特定要求时,文件名本身带有配置标识会非常有用。CMake可以很方便地为不同配置的目标添加后缀。

最常见的需求是给Debug版本的库和可执行文件加上_d后缀。

# 方法1:设置全局变量(影响之后定义的所有目标)
set(CMAKE_DEBUG_POSTFIX "_d")
# 你还可以为其他配置设置后缀
set(CMAKE_RELEASE_POSTFIX "") # 默认就是空,显式声明更清晰
# set(CMAKE_RELWITHDEBINFO_POSTFIX "_rd")
# set(CMAKE_MINSIZEREL_POSTFIX "_ms")

# 方法2:针对特定目标设置(优先级更高,更推荐用于精细控制)
add_library(my_shared_lib SHARED ${SOURCES})
add_executable(my_app ${APP_SOURCES})

# 使用set_target_properties为单个目标设置属性
set_target_properties(my_shared_lib PROPERTIES
    DEBUG_POSTFIX "_d"
    # RELEASE_POSTFIX "_r" # 如果需要的话
)

set_target_properties(my_app PROPERTIES
    DEBUG_POSTFIX "_d"
)

下表对比了两种方法的适用场景:

方法设置方式作用范围优点缺点
全局变量set(CMAKE_<CONFIG>_POSTFIX "...")之后定义的所有库/可执行文件配置简单,一劳永逸不够灵活,无法为特定目标豁免或设置不同后缀
目标属性set_target_properties(... PROPERTIES ..._POSTFIX "...")指定的单个目标控制粒度细,灵活性高每个目标都需要单独设置,稍显繁琐

在实际项目中,我通常采用混合策略:先通过全局变量设置一个默认的后缀规则(例如所有Debug版本加_d),然后对于极少数有特殊要求的目标(比如某个核心库在任何配置下都不加后缀),再使用set_target_properties进行覆盖。

# 顶层CMakeLists.txt
set(CMAKE_DEBUG_POSTFIX "_d")

# ... 其他代码 ...

# 对于特殊的“Core”库,我们希望它的文件名始终保持一致,便于其他模块链接
add_library(Core STATIC ${CORE_SOURCES})
set_target_properties(Core PROPERTIES
    DEBUG_POSTFIX "" # 覆盖全局的_d后缀
    RELEASE_POSTFIX ""
)

4. 安装(Install)与部署:构建产物的最终归宿

输出路径(Output Directory)管理的是构建过程中的临时产物位置,而安装(Install)定义的是项目构建完成后,文件应该被复制到的“最终”位置,通常用于打包、分发或系统级部署。这是两个阶段,但密切相关。

CMake的install()命令功能强大,可以安装目标、文件、目录甚至整个导出集。一个规范的安装配置,能让你的项目更容易地被其他CMake项目通过find_package()找到和使用。

首先,我们通常需要设置安装的前缀(Prefix),即基础目录。

# 设置安装前缀。如果用户通过`cmake -DCMAKE_INSTALL_PREFIX=/path/to/install ..`指定,则优先使用用户的设置。
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    # 如果是默认前缀(Unix: /usr/local, Windows: C:/Program Files/...),我们可以修改它。
    # 例如,改为安装到构建目录下的install文件夹,便于测试。
    set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation prefix" FORCE)
endif()

然后,为每个需要安装的目标指定安装规则。这里的关键是理解RUNTIME、LIBRARY、ARCHIVE等关键字在不同平台上的含义:

组件类型WindowsLinux/macOS典型安装子目录
RUNTIME.exe, .dll可执行文件bin/
LIBRARY(不常用).so, .dylib (共享库)lib/
ARCHIVE.lib (静态库和DLL的导入库).a (静态库)lib/

一个完整的安装示例如下:

# 假设我们有一个可执行程序和一个动态库
add_executable(my_tool tool.cpp)
add_library(my_shared SHARED library.cpp)

# 安装可执行文件到 <prefix>/bin
install(TARGETS my_tool
    RUNTIME DESTINATION bin
    # 可执行文件在Windows下属于RUNTIME,在Unix下也属于RUNTIME
)

# 安装动态库
install(TARGETS my_shared
    RUNTIME DESTINATION bin  # Windows的.dll文件
    LIBRARY DESTINATION lib  # Unix的.so/.dylib文件
    ARCHIVE DESTINATION lib  # Windows的.lib导入库,Unix的.a静态库(如果是静态库)
)

# 安装头文件
install(DIRECTORY include/ DESTINATION include)

# 安装配置文件、资源文件等
install(FILES config.json DESTINATION etc)
install(DIRECTORY resources/ DESTINATION share/myproject)

配置完成后,用户可以通过cmake --build . --target install(或make install)命令,将构建好的文件安装到CMAKE_INSTALL_PREFIX指定的目录中,结构清晰,直接可用于分发。

5. 实战:一个完整的多模块项目配置示例

让我们将这些知识点整合到一个假设的、包含应用、核心库和工具库的中型项目中,看看最终的CMakeLists.txt会是什么样子。

cmake_minimum_required(VERSION 3.15)
project(SuperApp VERSION 2.1.0)

# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# --- 第1步:定义全局输出布局 ---
set(PROJECT_OUTPUT_ROOT "${CMAKE_BINARY_DIR}/dist") # 使用dist作为输出目录名
# 为所有目标设置基于配置的输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_OUTPUT_ROOT}/$<CONFIG>/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_OUTPUT_ROOT}/$<CONFIG>/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_OUTPUT_ROOT}/$<CONFIG>/lib")
# 设置Debug版本后缀
set(CMAKE_DEBUG_POSTFIX "_d")

# --- 第2步:添加子项目/模块 ---
add_subdirectory(core)      # 核心静态库
add_subdirectory(utils)     # 工具动态库
add_subdirectory(app)       # 主应用程序

# --- 第3步:全局安装配置 ---
# 设置一个项目相关的安装子目录,避免污染系统目录
include(GNUInstallDirs) # 引入GNU标准目录变量,如${CMAKE_INSTALL_BINDIR}
set(INSTALL_BIN_DIR "${CMAKE_INSTALL_BINDIR}")
set(INSTALL_LIB_DIR "${CMAKE_INSTALL_LIBDIR}/superapp")
set(INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/superapp")

# 安装导出文件,便于其他CMake项目通过find_package(SuperApp)导入
install(EXPORT SuperAppTargets
    FILE SuperAppTargets.cmake
    NAMESPACE SuperApp::
    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/SuperApp"
)

core/CMakeLists.txt:

# 核心库,静态链接,不希望有后缀(便于其他模块链接)
add_library(SuperCore STATIC ${CORE_SOURCES})
target_include_directories(SuperCore PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>
)
# 覆盖全局后缀规则
set_target_properties(SuperCore PROPERTIES
    DEBUG_POSTFIX ""
    RELEASE_POSTFIX ""
)

# 安装核心库和头文件
install(TARGETS SuperCore
    EXPORT SuperAppTargets
    ARCHIVE DESTINATION ${INSTALL_LIB_DIR}
)
install(DIRECTORY include/ DESTINATION ${INSTALL_INCLUDE_DIR}/core)

utils/CMakeLists.txt:

# 工具库,动态链接
add_library(SuperUtils SHARED ${UTILS_SOURCES})
target_include_directories(SuperUtils PUBLIC ...)
target_link_libraries(SuperUtils PRIVATE SuperCore) # 链接核心静态库

# 安装动态库
install(TARGETS SuperUtils
    EXPORT SuperAppTargets
    RUNTIME DESTINATION ${INSTALL_BIN_DIR}  # .dll
    LIBRARY DESTINATION ${INSTALL_LIB_DIR}  # .so/.dylib
    ARCHIVE DESTINATION ${INSTALL_LIB_DIR}  # .lib (for DLL)
)

app/CMakeLists.txt:

# 主应用程序
add_executable(SuperApp ${APP_SOURCES})
target_link_libraries(SuperApp PRIVATE SuperCore SuperUtils)

# 安装可执行文件
install(TARGETS SuperApp
    RUNTIME DESTINATION ${INSTALL_BIN_DIR}
)

# 一个实用的技巧:在构建后自动将运行时依赖的动态库复制到可执行文件旁边(仅Windows示例)
if(WIN32)
    add_custom_command(TARGET SuperApp POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "$<TARGET_RUNTIME_DLLS:SuperApp>"
            "$<TARGET_FILE_DIR:SuperApp>"
        COMMAND_EXPAND_LISTS
    )
endif()

通过这样一套组合拳,你的项目无论是在开发阶段的build/dist/Debug/bin中,还是在最终安装的/usr/local/bin或C:\Program Files\SuperApp\bin中,都会保持清晰、一致且专业的结构。这种规范性极大地简化了调试、测试、持续集成和最终交付的流程。

VS 2022 C++项目一键集成OpenCV:基于vcpkg与CMake的现代化依赖管理方案 在C++项目开发中,第三方库的依赖管理是提升开发效率和保证项目可移植性的关键环节。传统手动配置库路径的方式不仅繁琐,还容易因环境差异导致构建失败。现代C++生态通过包管理器和构建系统生成器,实现了声明式的依赖管理。vcpkg作为微软官方维护的跨平台C++包管理器,其核心原理是从源码或预编译包统一管理库的安装,并生成标准的CMake配置文件。CMake作为构建系统生成器,通过find_package等命令,能自动定位并配置这些库,将开发者从繁琐的路径配置中解放出来。这种方案的技术价值在于实现了依赖的自动化解析 阅读详情

相关推荐

告别环境变量:在Qt项目中用CMake一键集成libtorch(支持Debug/Release切换)

本文详细介绍了如何在Qt项目中利用CMake实现libtorch的自动化集成,彻底摆脱环境变量依赖,并支持Debug/Release构建模式的智能切换。通过三种集成方案(find_package、FetchContent动态下载、生成器表达式管理)和实战示例,帮助开发者高效整合Qt与libtorch,特别适用于Windows/MSVC和Linux开发环境。

weixin_28704239的博客 280

cmake设置Debug版本和Release版本的输出路径

项目背景:指定可执行文件和动态库输出路径都在bin目录文件夹下,由于项目中存在osg插件,然后我在项目中需要重写osg的插件,这时候就会遇到指定输出路径的问题,由于需要输出到osgPlugins-3.6.5文件夹下,所以使用默认的输出方式不行。设置输出路径的属性。

一个小菜鸡的学习之路 1401

Qt Creator 里用 CMake 管理第三方库,我踩过的这些坑你千万别再踩了

本文分享了在Qt Creator中使用CMake管理第三方库时常见的5个致命陷阱及解决方案,包括头文件包含、Debug/Release模式配置、DLL文件拷贝、构建套件匹配等关键问题。通过实战案例和现代CMake最佳实践,帮助开发者避免常见错误,提升项目配置效率。

weixin_30271335的博客 273

CMake生成Debug和Release目标程序时的一些配置

本文章将介绍在Windows和Linux平台,生成可执行程序时,如何设置Debug和Release的一些属性。主要介绍如何设置目标程序的生成路径,以及运行时库的设置和目标程序版本号的设置。

new9232的博客 9275

CMake目录变量详解:从源码构建到安装部署的路径导航

在C/C++项目构建中,CMake作为主流的跨平台构建系统,其核心功能之一是管理复杂的项目目录结构。理解其目录变量体系是掌握现代构建系统的关键,这涉及到源代码组织、构建产物分离和软件安装部署等多个工程实践环节。CMake通过一套精心设计的变量(如CMAKE_SOURCE_DIR、CMAKE_BINARY_DIR、CMAKE_INSTALL_PREFIX等)来定义从源码到构建再到安装的完整路径映射,这些变量共同构成了项目的“路径导航系统”。正确使用这些变量能确保头文件查找、库文件链接和安装路径的准确性,避免常

weixin_30615767的博客 322

CLion实战:基于CMake构建跨平台C++日志库

CMake作为C/C++跨平台构建的事实标准,通过抽象项目描述与本地构建工具,实现了“一次编写,到处构建”的核心价值。其原理在于将平台差异封装在生成器(如Makefiles、Visual Studio解决方案)中,开发者只需维护统一的CMakeLists.txt。这种模式极大提升了工程实践效率,尤其在开发需要部署于Windows、Linux、macOS等多环境的应用程序时,例如日志系统、网络服务等基础组件。CLion作为深度集成CMake的智能IDE,将代码分析、重构、调试与跨平台构建无缝衔接,提供了统一的

weixin_33845881的博客 489

Cmake 学习笔记(三)常用预定义变量

常用变量 CMAKE_SOURCE_DIR 等同于PROJECT_SOURCE_DIR,源文件所在地址,顶层工程源码 CMAKE_BINARY_DIR 等同于PROJECT_BINARY_DIR,生成工程目标地址,顶层工程编译地址 CMAKE_CURRENT_SOURCE_DIR 等同于PROJECT_SOURCE_DIR,当前CMakeList所在地址 CMAKE_CURRREN...

黄胶鞋和七分裤 1407

CMake与VSCode搭建高效C++开发环境:从原理到实战配置指南

在C++项目开发中,构建系统和集成开发环境是提升工程效率的核心基础设施。CMake作为跨平台的构建系统生成器,其核心原理是通过声明式的CMakeLists.txt配置文件,抽象不同操作系统和编译器的差异,实现“一次编写,到处构建”。这项技术解决了多平台编译、依赖管理和项目结构标准化的工程难题,尤其适用于中大型项目。VSCode凭借其轻量级设计和强大的插件生态,为代码编辑、智能感知和调试提供了现代化体验。通过CMake Tools等插件将两者深度集成,开发者可以在统一的界面中完成配置、构建、运行和调试的全流程

weixin_30570101的博客 395

【cmake】CMakeList添加库|添加头文件|添加路径|add_executable、add_library、target_link_libraries|添加编译选项|宏开关

CMake.list相关配置详细说明。

Vincent20111024的专栏 1万+

Windows下使用CMake与VS2022手动编译配置OpenCV 4.5.0全攻略

计算机视觉是人工智能领域的关键分支,其核心在于让计算机从图像或视频中提取并理解信息。OpenCV作为该领域应用最广泛的开源库,提供了丰富的算法和工具,是实现图像处理、目标检测、特征匹配等功能的基石。其价值在于为开发者和研究者提供了一个跨平台、高性能的底层支撑,极大地降低了计算机视觉应用的开发门槛。在工程实践中,为了获得更好的性能、定制化功能或解决特定依赖问题,手动从源码编译OpenCV成为一项重要的进阶技能。这涉及到对构建系统(如CMake)、编译器(如MSVC)和项目依赖管理的深入理解。本指南聚焦于在Wi

weixin_34401479的博客 392

工业4.0 底层逻辑

工业4.0 的概念已经被滥用了,它与物联网,工业物联网等概念一样,几乎什么都往里面装。演变成了一句口号和愿景。许多人并不清楚工业4.0的底层逻辑到底是什么?如何遵循工业4.0 的思想构建新一代智能制造系统?并没用清晰地展示工业4.0的技术路线图。

姚家湾博客 1997

CMake基础知识学习

CMake入门知识点

Copperxcx的博客 1644

产生式系统的完整示例——医疗诊断系统(附python代码)

发烧(Fever)、咳嗽(Cough)、皮疹(Rash)、喉咙痛(SoreThroat)、头痛(Headache)、流涕(RunnyNose)、呼吸困难(ShortnessOfBreath)、白细胞计数高(HighWBC)、接触流感患者(ContactFlu)、接触麻疹患者(ContactMeasles)。(2)若规则库中存在尚未使用过的规则,而且它的前提(前件)可与综合数据库中的已知事实匹配,则转第(3)步;(3)执行当前选中的规则,并对该规则做上标记,把该规则执行后得到的结论送入综合数据库中。

搏博的专栏 1706

CMake实战:如何优雅地管理libpng和zlib的跨平台依赖关系

本文详细介绍了如何使用CMake优雅地管理libpng和zlib的跨平台依赖关系,特别针对Windows平台的特殊问题提供了解决方案。通过现代CMake的find_package机制和目标别名技术,开发者可以高效处理依赖管理,提升项目可维护性。文章还介绍了CPM.cmake工具,为复杂项目提供源码级集成方案。

bert9linguist的博客 415

Shopee App加密算法逆向实战:从抓包到libshpssdk.so的深度解析

本文详细解析了Shopee App加密算法的逆向过程,从网络抓包发现加密参数入手,通过Frida动态Hook定位到Java层关键方法,并深入追踪至Native层的libshpssdk.so核心函数。文章结合实战演示了如何利用Unidbg模拟执行环境进行算法分析与验证,并探讨了核心参数生成逻辑及风控规避要点,为移动安全与逆向工程研究提供了完整的技术路径。

weixin_28347369的博客 531

Redhawk:switch model

redhawk switch model

m0_61544122的博客 3457

CMake输出路径配置全攻略:从可执行文件到动态库的终极指南

本文全面解析CMake输出路径配置技巧,从基础变量理解到高级目标控制,涵盖可执行文件、静态库和动态库的路径设置。详细介绍安装路径配置、跨平台处理及现代CMake最佳实践,帮助开发者实现规范化项目结构管理,提升构建效率。特别针对输出路径和当前目录等关键概念提供实用解决方案。

ipfs8storage的博客 591

数字签名原理简述

本文结合下面两个问题来讲解数字签名的基本原理。结合图片希望能给大家一个清晰简单明了的分析和讲解。 1. 问题描述: (1)用户A向远方的用户B发送一个消息,用户B如何确认所收到的消息在传输的过程中没被篡改过? (2)用户B收到了消息之后,如何防止A随之否认这个消息是他发送的呢? ---------阅读本文的知识储备:了解非对称加密的基本原理。-------- 2. 使用方法:数字签名 类比于现实生活,我可以在一个支票上面签名,表示这张支票确实是我本人签署的。收到这张支票的人到银行去兑现的时候,工

smilejiasmile的博客 3377

CMake实战指南:从零构建跨平台C++项目,告别环境配置难题

在C++项目开发中,构建系统是连接源代码与可执行程序的关键桥梁,它负责管理编译、链接和依赖关系。传统的手写Makefile方式在项目规模扩大和跨平台需求面前,往往变得难以维护。CMake作为一种构建系统生成器,通过声明式的CMakeLists.txt文件描述项目结构和依赖,能够自动生成适用于不同平台和编译器的本地构建文件(如Makefile或Visual Studio项目),从而实现了构建逻辑的统一。其技术价值在于显著提升了C++项目的可维护性、可移植性和团队协作效率。通过target_link_libra

weixin_33701294的博客 436

基于YOLOv11的气象目标检测系统:台风眼与钩状回波检测

气象目标检测是计算机视觉在气象领域的重要应用,对台风预警和强对流天气监测具有重要意义。本文详细介绍了一种基于YOLOv11的气象目标检测系统,能够有效识别卫星云图中的台风眼和雷达图中的钩状回波。系统包含完整的数据处理流程、模型训练策略以及用户友好的Web界面。我们使用了公开的气象数据集进行训练和验证,并提供了完整的实现代码。实验结果表明,本系统在气象目标检测任务中达到了较高的准确率和实用性。关键词:气象目标检测;YOLOv11;台风眼检测;钩状回波;深度学习;计算机视觉台风眼检测数据集。

YOLO 474

【Bug已解决】openclaw command not found / openclaw not installed — OpenClaw CLI 安装失败解决方案

安装 OpenClaw 后命令未找到或运行失败,本质是 PATH 未配置或 Python 版本不兼容。文中给出修复 PATH、使用虚拟环境、检查 Python 版本、pipx 安装等完整方案。

一键难忘的博客 8065

CMake库管理终极指南:从‘find_package’到制作可被他人引用的Config文件

本文深入解析CMake库管理的完整实践,从`find_package`的使用到制作专业的Config文件,涵盖调试版与发行版的共存策略、组件化设计及跨平台注意事项。通过现代CMake技术,开发者可以创建如系统级库般易用的C++库,提升代码复用性和工程效率。

weixin_28837817的博客 399

ESP32-C3蓝牙透传通信的BLE协议栈工程实践

蓝牙低功耗(BLE)透传是一种基于GATT服务模型的数据透明传输机制,其核心原理在于Peripheral设备通过广播建立连接,并在GATT Server层暴露可读写特征值实现双向数据通道。该技术具备低功耗、跨平台兼容性强、开发门槛适中等优势,广泛应用于智能硬件、工业传感器与嵌入式网关等场景。在实际工程中,透传稳定性高度依赖BLE协议栈的分层协同——Link Layer负责可靠连接建立,GATT Server则定义数据交互语义;而ESP32-C3的AT指令集正是对这两层能力的封装调度。本文聚焦BLE透传的关键

weixin_29859471的博客 124

CMake install()命令详解:跨平台C/C++项目自动化部署实战

在C/C++项目开发中,构建系统是连接源代码与可执行产物的核心桥梁。CMake作为主流的跨平台构建工具,其install()命令实现了从构建到部署的标准化流程。通过声明式配置,开发者可以定义文件安装规则,CMake则自动处理不同平台下的路径转换和权限设置。这一机制在工程实践中极大提升了部署效率,尤其适用于需要处理复杂文件结构、多平台适配和精细化权限控制的场景。本文深入解析install()命令的高级用法,涵盖生成器表达式实现智能类型适配、目录权限配置等关键技术,为跨平台项目提供完整的自动化部署解决方案。

weixin_33868027的博客 368

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

CMake模块开发避坑指南:从FindXXX.cmake到Config.cmake的进化之路

本文深入探讨了CMake包管理从传统的FindXXX.cmake模块向现代XXXConfig.cmake配置文件的演进之路。通过对比模块模式与配置模式的本质差异,文章详细阐述了为何以及如何将库的查找逻辑从消费者主导的“寻宝游戏”升级为提供者主导的声明式配置,从而提升库的集成体验、维护性和跨平台兼容性,并自然融入了find_package等核心热词。

fern8的博客 651

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Nabla渲染框架集成教程:用find_package在CMake项目中优雅接入Vulkan渲染库

Nabla是一款面向PC/Linux/Android的模块化渲染框架,深度整合Vulkan、OptiX与CUDA互操作能力。本教程面向初学者,手把手教你通过CMake的`find_package`命令将Nabla渲染框架接入自己的项目,告别手动配置头文件路径和链接库的繁琐流程,几行代码即可完成渲染框架集成。 ## 为什么选择find_package方式接入Nabla渲染框架? 传统的第三方库集

gitblog_00886的博客 491

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 物联网开发者必备:5分钟快速配置ESP-WRO0M-32的VS Code开发环境(2023最新版)
下一篇: SSD选购避坑指南:从SATA到PCIe 4.0,不同接口对速度的影响有多大?
gitlab7runner
博客等级 码龄4年 78粉丝 1747原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值