You need to enable JavaScript to run this app. VS2019 CMake项目如何将第三方依赖整合到单个DLL中
优惠活动
大模型
产品
解决方案
定价
更多

VS2019 CMake项目如何将第三方依赖整合到单个DLL中

调整优先级(从高到低,优先处理靠前的配置)

1. 优先调整vcpkg依赖的链接模式

你当前生成多个独立DLL的核心原因是vcpkg默认安装的是protobuf、spdlog等库的动态版本,链接时只会把导入表信息写入主DLL,运行时依赖对应依赖库的DLL。
首先将依赖改为静态版本:

  • 安装依赖时指定静态triplet:vcpkg install protobuf:x64-windows-static spdlog:x64-windows-static
  • CMake配置时指定triplet参数:-DVCPKG_TARGET_TRIPLET=x64-windows-static
    同时要注意静态库需要匹配MSVC静态运行库,后续编译参数要对应调整为/MT(Release模式)或/MTd(Debug模式)。

2. 其次调整CMakeLists.txt配置

确认CMake链接的是第三方库的静态目标:

  • 增加配置项强制找静态库:
    set(protobuf_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
    set(SPDLOG_BUILD_SHARED OFF CACHE BOOL "" FORCE)
    
  • 调用find_package找到对应静态库后,直接将静态库目标链接到你的主DLL目标即可:
    add_library(main SHARED ${YOUR_SOURCE_FILES})
    target_link_libraries(main PRIVATE protobuf::libprotobuf spdlog::spdlog)
    

只要链接的是静态库目标,CMake会自动让链接器把静态库的代码合并到主DLL中。

3. 最后按需调整MSVC编译/链接参数

这一步是配合前两步的适配操作,不需要大幅修改:

  • 编译参数匹配静态运行库:
    target_compile_options(main PRIVATE $<$<CONFIG:Release>:/MT> $<$<CONFIG:Debug>:/MTd>)
    
  • 如果出现部分第三方符号未被合并的情况,可加链接参数强制打包整个静态库:
    target_link_options(main PRIVATE /WHOLEARCHIVE:libprotobuf.lib)
    

无需调整的项

  • 项目C++代码:函数内联等改动和依赖库合并逻辑无关,除非你有自定义导出符号冲突,否则完全不需要修改代码
  • Ninja参数:Ninja仅作为构建生成器,不控制编译链接的合并逻辑,不需要做任何调整

内容的提问来源于stack exchange,提问作者Kitsune

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 11:06:08