首页
学习
活动
专区
圈层
工具
发布

现代C++工具链实战:CMake + Conan + vcpkg依赖管理

CMake:构建系统的核心CMake作为现代C++项目的事实标准,提供了跨平台的构建配置能力。我采用了现代CMake(3.15+)的写法,强调target-based的设计理念。...Conan:跨平台依赖管理Conan作为C/C++的包管理器,解决了跨平台二进制包的依赖问题。...、spdlog)通过Conan管理平台特定库在Windows上使用vcpkg预编译二进制大型库(Boost)根据平台选择共享或静态链接# conanfile.py(高级配置)from conan import.../3.11.2[options]spdlog:fmt_external=True # 使用外部fmt库性能优化实践1....C++工具链的最佳实践:统一依赖管理:优先使用Conan,vcpkg作为Windows平台的补充现代CMake写法:采用target-based的现代CMake实践分层配置:区分开发、测试、生产环境的依赖配置持续集成

64910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++ 编译体系入门指北

    对C++的编译体系是如何发展的,为什么要用CMake,它的运作原理是如何的比较感兴趣,所以就想系统学习一下,特此整理本篇文章作为入门指引。...包管理器 早期阶段 在C++ 早期阶段,开发者主要依赖于手动管理库和依赖项。这通常包括下载源代码或预编译的二进制文件,然后将其集成到项目中。这种方式虽然灵活,但容易出错且难以维护。...虽然它简化了库的使用,但仍然需要手动安装和管理库。 Conan Conan 是一个现代的、跨平台的 C++ 包管理器,旨在解决依赖管理问题。...它通过 CMake 的外部项目功能来管理依赖项,适合那些已经使用 CMake 作为构建系统的项目。 Buckaroo Buckaroo 是一个基于 Buck 构建系统的 C++ 包管理器。...它适合那些希望最小化外部依赖的项目。

    1.2K21

    McSema技术升级:从二进制到LLVM比特码的现代化转换

    现在使用McSema分析和逆向工程二进制文件比以往任何时候都更加容易。...:改进控制流图遍历方式,移除Boost依赖,简化比特码生成流程生成更精简的比特码:不再在函数入口/出口存储和溢出寄存器上下文,标志操作使用更快的自然位宽操作替代位域,支持通过优化消除未使用的计算现代化升级迁移至标准版...LLVM 3.8(原使用自定义修改的LLVM 3.5)使用现代C++11特性完全替代Boost依赖简化改进新版命令行接口更统一易用:mcsema-disass反汇编二进制文件,mcsema-lift将反汇编转换为...LLVM比特码移除了自定义二进制反汇编器bin_descend,现仅支持使用IDA Pro作为反汇编引擎的解码器代码布局更直观,CMake构建脚本更精简采用无外部依赖的集成测试框架替代旧测试框架新特性支持更多指令集...、扩展和调试McSema代码库,包含常见错误解决方案,显著降低第三方开发者的参与门槛。

    23110

    CMake学习笔记合集

    内部构建和外部构建 上述例子就是内部构建,他生产的临时文件特别多,不方便清理 外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响强烈使用外部构建方式 外部构建方式举例 //例子目录.../configure –prefix=/usr 如何安装HelloWord 使用CMAKE一个新的指令:INSTALL INSTALL的安装可以包括:二进制、动态库、静态库以及文件、目录、脚本等 使用CMAKE...安装过程 cmake .. make make install 静态库和动态库的构建 任务: 1,建立一个静态库和动态库,提供 HelloFunc 函数供其他程序编程使用,HelloFunc 向终端输出...DESTINATION include/hello) //二进制,静态库,动态库安装都用TARGETS //ARCHIVE 特指静态库,LIBRARY 特指动态库,RUNTIME 特指可执行目标二进制...使用外部共享库和头文件 准备工作,新建一个目录来使用外部共享库和头文件 [root@MiWiFi-R4CM-srv cmake3]# tree . ├── build ├── CMakeLists.txt

    2.5K20

    CMake学习笔记

    外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响强烈使用外部构建方式 外部构建方式举例 //例子目录,CMakeLists.txt和上面例子一致 [root@localhost.../configure –prefix=/usr 如何安装HelloWord 使用CMAKE一个新的指令:INSTALL INSTALL的安装可以包括:二进制、动态库、静态库以及文件、目录、脚本等 使用CMAKE..... make make install 静态库和动态库的构建 任务: 1,建立一个静态库和动态库,提供 HelloFunc 函数供其他程序编程使用,HelloFunc 向终端输出 Hello World...DESTINATION include/hello) //二进制,静态库,动态库安装都用TARGETS //ARCHIVE 特指静态库,LIBRARY 特指动态库,RUNTIME 特指可执行目标二进制...使用外部共享库和头文件 准备工作,新建一个目录来使用外部共享库和头文件 [root@MiWiFi-R4CM-srv cmake3]# tree . ├── build ├── CMakeLists.txt

    2.6K20

    CMake学习笔记(二)——CMake语法

    开关选项 BUILD_SHARED_LIBS 控制默认的库编译方式。 注:如果未进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库。...内部构建方法中,cmake生成的中间文件和可执行文件都会存放在项目目录中;外部构建方法中,中间文件与可执行文件都存放在build目录中。 笔者强烈建议使用外部构建方法。...我们可以通过SET指令对其进行设置最终的目标二进制的位置,即最终生成的工程可执行文件与最终的共享库,而不包含编译生成的中间文件。...该指令用于添加外部库的搜索路径。 10....; 指定链接目标文件时需要链接的外部库,效果类似于gcc编译参数-L,解决外部库依赖的问题。

    6.6K100

    面向 C++ 的现代 CMake 教程(三)

    进行链接 你可能会认为,在我们成功将源代码编译成二进制文件之后,作为构建工程师我们的工作就完成了。...: 依赖地狱 模块与共享库的区别: 模块与共享库的区别 第七章:使用 CMake 管理依赖 你的解决方案是大型还是小型,并不重要;随着它的成熟,你最终会决定引入外部依赖。...使用 Git 仓库工作 许多项目依赖于 Git 作为版本控制系统。假设我们的项目和外部库都在使用它,有没有某种 Git 魔法能让我们把这些仓库链接在一起?...我们能否构建库的特定(或最新)版本,作为构建我们项目的一个步骤?如果是,怎么做? 通过 Git 子模块提供外部库 一个可能的解决方案是使用 Git 内置的机制,称为Git 子模块。...当然,如果你能使用现代 C++(是的,C++11 不再被认为是“现代”的),那么推荐使用更新的版本。在与 Catch2 合作时,你应该选择一个 Git 标签并在你的列表文件中固定它。

    1.8K00

    CMake构建学习笔记27-初步完成C&C++自动化构建工具

    部署 本项目几乎无需额外部署环境,仅依赖系统自带的脚本引擎和基础构建工具: Windows:使用 PowerShell 脚本(系统预装) Linux (Ubuntu):使用标准 Shell 脚本(bash...) 虽然脚本本身无外部依赖,但编译 C/C++ 依赖库仍需以下基础工具: 平台 构建系统 编译器 Windows CMake MSVC(推荐通过完整版 Visual Studio 安装) Linux...优先构建动态库:尽管跨版本二进制兼容仍是挑战,但 Windows 和 Linux 平台在其自身生态内已具备一定的动态库兼容能力,因此本项目默认生成 .dll / .so 文件,以提升复用性与部署灵活性。...✅ 测试 本项目已在以下环境中完成构建与验证,相关二进制成果已发布供参考和使用: Windows 11 (x64) 使用 Visual Studio 2019 (MSVC) 成功构建,生成的预编译库已发布至另一个...这些预构建产物可用于快速验证或作为离线部署的参考基线。建议在生产环境中仍优先使用源码构建,以确保环境一致性与可定制性。

    18010

    c++大型工程构建演化

    2.2 公共库统一管理 在视频实体机开发年代,有一个最原始的母机,里面有所有的视频公共库代码和编译好的.a静态库文件,母机通过crontab的方式每天凌晨给各个组的开发机通过rsync命令同步公共库,达到各个组使用的公共库是同一个版本...2.3 业务怎么使用公共库 公共库统一放到一个目录,定时更新,公共库里面有一个makefile.comm文件,该文件定义好公共库对外的宏,程序直接使用这个宏来达到包含指定库的目的,通过预定义宏的方式可以向开发者屏蔽公共库的升级操作导致目录变更导致编译找不到文件的问题...,遇到库相互依赖导致的符号问题以及二进制兼容真的让人很头疼,出现问题及其难定位; 公共库升级慢,更新是以天为单位,要想实现即时更新还得人为操作; 母机这种单一实体机的管理方式,存在硬件故障的风险。...公共库也伴随着框架的改造输出cmake的引用变量。...,需要引用外部库的时候还是一样需要先把外部库拷贝到视频自己的公共库。

    1.7K30

    面向 C++ 的现代 CMake 教程(四)

    然而,找到所有属于目标(以及可能的依赖目标)的源文件和头文件是一个非常复杂的过程,尤其是当我们需要过滤掉属于外部库且不应该格式化的头文件时。在这种情况下,按目录工作更加可行。...这个命令对于小到中等大小的代码库来说效果很好。对于大量文件,我们需要将绝对文件路径转换为相对路径,并使用directory作为工作目录执行格式化(list(TRANSFORM)命令在这里很有用)。...它是用 Python 编写的,这可能会成为某些项目不愿依赖的库。提供的修复格式可以被 Emacs、Eclipse、VS7、Junit 以及作为sed命令的格式所消费。...在发布该选项之前,我们可以使用此机制与PRIVATE_HEADER和RESOURCE工件类型。但我们如何指定更复杂的安装目录结构呢? 低级安装 现代 CMake 正在逐步放弃直接操作文件的概念。...安装目录处理了很多不同的用例,但对于真正高级的安装场景(如安装后配置),我们可能需要使用外部工具。我们应该如何做到这一点?

    2K00

    面向 C++ 的现代 CMake 教程(二)

    find_modules 以及一次性脚本 src:将存储我们的二进制文件和库的源代码 doc:用于构建文档 extern:我们从中源代码构建的外部项目的配置 test:包含自动化测试的代码...只有当我们从项目中外部使用库时,这个目录才应该存在。它提供了其他项目在编译时将消耗的公共头文件。我们将在第五章*,使用 CMake 编译 C++源代码中回到这个主题,构建我们自己的库。...后来,这些文件将被链接器用来构建单一的二进制文件。现代编译器可以在链接后进行优化(这称为链接时优化),以便所有编译单元可以作为一个单一模块进行优化。...导入的目标 如果你浏览了目录,你知道我们将讨论 CMake 如何管理外部依赖项——其他项目、库等等。IMPORTED目标本质上就是这一过程的产物。...这样做有两种方式——使用其输出工件作为可执行文件(或库)的源,或者明确将其添加到自定义目标的一个DEPENDS列表中。 将自定义命令作为生成器使用 诚然,不是每个项目都需要从其他文件生成 C++代码。

    1.9K10

    从零开始编写一个cmake构建脚本

    ,可执行二进制文件存放的路径set(TARGET_INSTALL_LIBDIR lib) # 定义变量存放三方库安装时,库存放的路径引用其他三方库引用其他三方库的方式有2种引用其他三方库的源码源码有cmake...) # TARGET_NAME 本库生成的库名, 通过 add_library 添加 引入三方库源码以及本库源码等生成目标TARGET_NAME引用其他三方库的二进制文件(.so)通过target_link_libraries...引用当前源码路径下的xxx库使用find_package方法来引用,此方法的使用限制参照IDE上find_package使用分析,使用方法: find_package(XXX REQUIRED)...()文件安装支持install,库对外提供被find_package的能力install后,所有导出的头文件、动态库、静态库、可执行二进制、cmake文件都可以安装到指定路径下install(TARGETS...}/lib/lib@TARGET_NAME@.a) #配置库,对外导出变量@PROJECT_NAME@_LIBRARIES供外部引用set(@PROJECT_NAME@SHARED_LIBRARIES

    48120

    cmake快速入门「建议收藏」

    为了使用外部编译方式编译项目,需要先在目录hello下新建一个目录build(也可以是其他任何目录名)。...这就是所谓的外部编译方式。 五、处理多源文件目录的方法 CMake处理源代码分布在不同目录中的情况也十分简单。现假设我们的源代码分布情况如下: 其中 src 目录下的文件要编译成一个链接库。...当这个变量值为 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成 Makefile ,当这个变量值为..."$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") 这个结果说明生成的 Makefile 中使用了变量 CMAKE_CXX_FLAGS_DEBUG 作为编译时的参数。..."$ENV{CXXFLAGS} -O3 -Wall") 这两个结果说明生成的 Makefile 中使用了变量 CMAKE_CXX_FLAGS_RELEASE 作为编译时的参数。

    1.6K60

    C++单元测试框架选型与实战速查手册

    一、框架核心价值定位1.1三大框架战略定位分析维度GoogleTest(v1.14+)Catch2(v3.5+)doctest(v2.4+)决策影响哲学定位企业级、全覆盖现代化、开发者友好极简主义、零负担决定团队协作模式核心优势工业级生态系统优雅的测试表达编译速度优势影响开发流程效率适用场景大型商业项目开源库...-GoogleTest:完整测试构建≈15分钟,二进制≈8MB-doctest:完整测试构建≈5分钟,二进制≈3.5MB-Catch2(v3):完整测试构建≈12分钟,二进制≈6MB二、技术特性深度对比...CMake集成模板GoogleTest集成(FetchContent)展开代码语言:TXTAI代码解释#推荐:现代FetchContent方式include(FetchContent)FetchContent_Declare...2.doctest用于快速原型迭代3.GoogleTest用于发布前的全面验证工具链:-使用Python脚本转换测试用例-配置不同的CMake构建目标5.3迁移策略与兼容层从GoogleTest迁移到Catch2...支持提升可读性单头文件部署简化依赖管理注重开发者体验与错误信息质量项目使用现代C++(14/17/20)特性✅选择doctest当:编译时间是最重要的考量因素目标环境资源严重受限(嵌入式)测试需要极低的内存与二进制开销希望测试代码对生产代码零侵入项目需要极简的集成与配置

    30300

    初识鸿蒙 NAPI:从概念到踩坑的跨语言开发入门

    一、NAPI 是什么:跨语言交互的 “翻译官” NAPI 并非鸿蒙独创,其设计参考了 Node.js 的 N-API 规范,本质是一套稳定的二进制接口(ABI)。...的project名、add_library名需与原生代码的nm_modname一致; ArkTS 导入的库名需与 CMake 生成的动态库名一致(如 CMake 生成libentry.so,ArkTS...):定义项目名称为entry(需与 NAPI 模块名、动态库名一致); set(CMAKE_CXX_STANDARD 17):指定 C++ 编译标准为 C++17(鸿蒙 NAPI 推荐的标准,兼容现代语法...); CMAKE_CXX_STANDARD_REQUIRED ON:强制使用指定的 C++ 标准,若编译器不支持则报错。...ABI(Application Binary Interface)是 “应用二进制接口”,决定了原生代码(C/C++)编译后的二进制文件能在哪些 CPU 架构的设备上运行。

    27200

    面向 C++ 的现代 CMake 教程(一)

    随着您的进展,您将学习如何编译和链接可执行文件和库,这些过程是如何详细工作的,以及如何优化所有步骤以获得最佳结果。您还将了解如何将外部依赖项添加到项目中:第三方库、测试框架、程序分析工具和文档生成器。...第七章,使用 CMake 管理依赖项,解释了现代 CMake 中可用的依赖管理方法。...我强烈建议至少使用版本 3.15,这个版本被认为是“现代 CMake”。如果您需要更多信息,您可以在cmake.org/cmake/help/找到最新的完整文档。...此目录的关键收获如下: 您的二进制文件将在此处创建,例如可执行文件和库文件,以及用于最终链接的对象文件和归档文件。 不要将此目录添加到您的 VCS 中——它是特定于您的系统的。...同时,这里有一些有趣的细节要注意: 配置文件(原名)包含有关如何使用库二进制文件、头文件和辅助工具的信息。有时,它们暴露出 CMake 宏,可以在您的项目中使用。

    2.4K01
    领券