CMake如何在构建curl的Makefile前先编译第三方库openssl
解决方案
根因
报错是两个配置问题共同导致的:
add_subdirectory顺序错误:CMake会按书写顺序逐行解析构建规则,你当前配置中curl的子目录引入早于openssl,解析curl的构建逻辑时openssl的编译路径、目标产物都还未生成,find_package自然找不到对应的库- 缺少显式构建依赖声明:即使调整了子目录顺序,并行构建场景下仍然可能出现编译顺序乱序的问题
修正配置
直接替换你的顶层CMakeLists.txt为以下内容即可:
# 优先引入被依赖的第三方库,保证其构建规则先被解析 add_subdirectory(thirdparty/openssl) add_subdirectory(thirdparty/libssh2) # 配置openssl查找参数,必须放在openssl子目录引入之后,此时openssl_BINARY_DIR已被正确赋值 set(OPENSSL_ROOT_DIR ${openssl_BINARY_DIR} CACHE PATH "OpenSSL build output path" FORCE) # 适配CMake 3.5版本FindOpenSSL模块的识别缺陷,强制指定头文件和库目标,跳过系统查找逻辑 set(OPENSSL_INCLUDE_DIR ${openssl_SOURCE_DIR}/include ${openssl_BINARY_DIR}/include CACHE PATH "OpenSSL header path" FORCE) set(OPENSSL_LIBRARIES ssl crypto CACHE FILEPATH "OpenSSL static library targets" FORCE) set(OPENSSL_FOUND TRUE CACHE BOOL "OpenSSL check status" FORCE) add_subdirectory(thirdparty/curl) # 显式声明构建顺序,强制curl在openssl编译完成后再构建 add_dependencies(curl ssl crypto) # 所有依赖配置完成后再引入自身业务代码目录 add_subdirectory(myapp)
补充说明
- 如果你的openssl子目录编译后的静态库名不是默认的
libssl.a、libcrypto.a,可以对应调整OPENSSL_LIBRARIES的配置值 - 如果libssh2也依赖openssl,可以额外添加
add_dependencies(libssh2 ssl crypto)保证构建顺序正确 - 配置中的
CACHE ... FORCE是为了覆盖curl内部find_package的默认查找逻辑,避免优先查找系统全局安装的openssl
内容的提问来源于stack exchange,提问作者Darpan Kamboj
相关产品推荐
相关产品推荐

