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
相关产品推荐
相关产品推荐

