如何强制覆盖find_package()以使用自定义Brotli编译curl
解决自定义Brotli编译curl的CMake冲突问题
方案1:手动设置Brotli变量,绕过Find模块
curl的CMake配置会优先检查BROTLI_FOUND、BROTLI_INCLUDE_DIR和BROTLI_LIBRARIES这些变量是否已定义。只要这些变量存在且有效,curl会直接使用它们,不会触发自带的FindBrotli.cmake。
在引入curl之前,手动配置这些变量即可:
# 标记Brotli已找到 set(BROTLI_FOUND ON) # 指定自定义Brotli的头文件目录 set(BROTLI_INCLUDE_DIR "/path/to/your/brotli/include") # 指定自定义Brotli的库文件(静态/动态库按需调整) set(BROTLI_LIBRARIES "/path/to/your/brotli/lib/libbrotlicommon.a" "/path/to/your/brotli/lib/libbrotlidec.a" "/path/to/your/brotli/lib/libbrotlienc.a" ) # 之后再引入curl(add_subdirectory或find_package均可) add_subdirectory(curl)
方案2:调整CMAKE_MODULE_PATH优先级,优先加载自定义Find模块
CMake会按CMAKE_MODULE_PATH的顺序查找Find模块。在加载curl之前,把你的自定义模块目录放到CMAKE_MODULE_PATH的最前端,就能让CMake优先使用你的FindBrotli.cmake。
示例代码:
# 将自定义CMake模块目录插入到路径最前面 list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/your-custom-cmake-modules") # 此时查找curl或引入curl子目录时,会优先加载你的FindBrotli.cmake find_package(CURL REQUIRED)
方案3:用ExternalProject_Add完全控制curl的构建流程
如果需要精细化控制(比如同步构建Brotli和curl),可以使用CMake的ExternalProject_Add模块,在构建curl时直接传递自定义Brotli的参数,彻底避开curl自带的Find模块。
示例代码:
include(ExternalProject) # 若你的Brotli也是通过ExternalProject构建,可先定义该项目 # ExternalProject_Add( # brotli # GIT_REPOSITORY https://github.com/google/brotli.git # GIT_TAG v1.1.0 # CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/brotli-install # ) # 构建curl并指定自定义Brotli路径 ExternalProject_Add( curl GIT_REPOSITORY https://github.com/curl/curl.git GIT_TAG v8.8.0 # 替换为你需要的curl版本 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DBUILD_SHARED_LIBS=ON # 按需设置静态/动态库 # 直接传递Brotli的头文件和库路径 -DBROTLI_INCLUDE_DIR=${CMAKE_CURRENT_BINARY_DIR}/brotli-install/include -DBROTLI_LIBRARIES="${CMAKE_CURRENT_BINARY_DIR}/brotli-install/lib/libbrotlicommon.so;${CMAKE_CURRENT_BINARY_DIR}/brotli-install/lib/libbrotlidec.so;${CMAKE_CURRENT_BINARY_DIR}/brotli-install/lib/libbrotlienc.so" # 若要让curl使用你的FindBrotli.cmake,可传递CMAKE_MODULE_PATH # -DCMAKE_MODULE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/your-custom-cmake-modules # DEPENDS brotli # 如果依赖上面的brotli项目,取消注释 )
内容的提问来源于stack exchange,提问作者Devilish Spirits
相关产品推荐
相关产品推荐

