如何在vcpkg中排除指定库(openssl)的静态链接?
实现Windows-static Triplet下仅动态链接OpenSSL的方法
以下是通过自定义overlay triplet实现需求的具体操作步骤:
1. 创建自定义Triplet文件
在vcpkg的triplets目录下(通常路径为vcpkg\triplets),新建一个triplet文件,命名格式为[架构]-windows-static-override-openssl.cmake,比如针对64位系统创建x64-windows-static-override-openssl.cmake,32位则对应x86-windows-static-override-openssl.cmake。
2. 编写Triplet配置内容
将以下代码写入新建的triplet文件,核心逻辑是继承原有静态triplet的配置,仅单独覆盖OpenSSL的链接方式:
# 继承默认的静态triplet配置 include(${CMAKE_CURRENT_LIST_DIR}/x64-windows-static.cmake) # 全局默认保持静态链接 set(VCPKG_LIBRARY_LINKAGE "static") # 单独将OpenSSL设置为动态链接 set(VCPKG_LIBRARY_LINKAGE_openssl "dynamic") # 保持原有静态triplet的CRT链接策略(若原triplet为静态CRT) set(VCPKG_POLICY_DYNAMIC_LINK_CRT OFF)
注意:如果是32位场景,将第一行的
x64-windows-static.cmake替换为x86-windows-static.cmake。
3. 使用自定义Triplet构建项目
方式一:通过vcpkg命令安装依赖时指定
执行安装命令时,将目标triplet指定为你新建的自定义triplet,示例:
vcpkg install openssl[core]:x64-windows-static-override-openssl boost:x64-windows-static-override-openssl
方式二:在CMake项目中指定
在项目的CMakeLists.txt开头添加以下配置,指定使用自定义triplet:
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake") set(VCPKG_TARGET_TRIPLET "x64-windows-static-override-openssl")
4. 验证效果
项目构建完成后,可通过工具(如Dependency Walker)检查生成的可执行文件依赖,会发现OpenSSL相关的libcrypto-*.dll和libssl-*.dll被列为动态依赖,而其他依赖库则已静态链接到可执行文件中。
内容的提问来源于stack exchange,提问作者Steel
相关产品推荐
相关产品推荐

