CMake 3.13下SEAL库从ExternalProject_Add转FetchContent并传编译参数
当然有办法实现!和ExternalProject_Add通过CMAKE_ARGS传递参数不同,FetchContent是直接将依赖库的源码拉入当前构建树,所以我们可以通过设置CMake缓存变量的方式,把配置参数传递给SEAL的构建流程。
核心原理
SEAL的CMakeLists.txt是用option(BUILD_SHARED_LIBS ...)来控制共享库构建的,而option本质上是创建了一个CMake缓存变量。只要在调用add_subdirectory之前,我们提前设置好这个缓存变量的值,SEAL的构建脚本就会读取我们设定的参数,而非默认的OFF。
完整修改后的代码
替换你原来的FetchContent代码为以下内容:
include(FetchContent) # 获取SEAL库 set(SEAL "seal") FetchContent_Declare( ${SEAL} GIT_REPOSITORY https://github.com/microsoft/SEAL GIT_TAG v3.5.2 ) FetchContent_GetProperties(${SEAL}) if(NOT ${SEAL}_POPULATED) FetchContent_Populate(${SEAL}) # 提前设置SEAL构建所需的缓存变量,强制启用共享库 set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared library" FORCE) # 如果你还需要传递其他SEAL的配置参数,比如启用ZLIB压缩,也可以在这里添加 # set(SEAL_USE_ZLIB ON CACHE BOOL "Use ZLIB for compression" FORCE) add_subdirectory(${${SEAL}_SOURCE_DIR} ${${SEAL}_BINARY_DIR}) endif()
关键细节说明
set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared library" FORCE):CACHE关键字将变量存入CMake缓存,确保SEAL的脚本能读取到;FORCE用来强制覆盖SEAL自身通过option设置的默认值,避免参数被重置。
- 必须把这个设置放在
add_subdirectory之前,否则SEAL的CMake脚本执行时会先读取默认值,我们的设置就不会生效。
额外注意事项
从你提供的SEAL代码片段可以看到:如果是MSVC环境,即使你设置了BUILD_SHARED_LIBS=ON,SEAL也会自动将其强制改为OFF并输出警告。这是SEAL自身的构建限制,和FetchContent的使用方式无关。
内容的提问来源于stack exchange,提问作者TalG
相关产品推荐
相关产品推荐

