如何修改CMake配置 将OpenSSL动态库链接切换为静态库
报错原因
你遇到构建报错的直接原因是硬编码时将两个静态库的路径拼接成了单个字符串,CMake会把引号包裹的整段内容识别为一个独立文件路径,自然不存在路径为/usr/lib/x86_64-linux-gnu/libssl.a/usr/lib/x86_64-linux-gnu/libcrypto.a的文件。
另外CMake内置的FindOpenSSL模块默认优先搜索动态链接库,所以默认配置下OPENSSL_LIBRARIES变量存储的是.so动态库的路径。
正确配置方案
推荐方案(兼容性最好)
使用FindOpenSSL模块原生提供的静态库开关,无需硬编码路径,适配不同环境的OpenSSL安装位置:
- 在项目中调用
find_package(OpenSSL REQUIRED)的代码之前,添加如下配置开启静态库搜索:
set(OPENSSL_USE_STATIC_LIBS TRUE)
- 原有
target_include_directories、target_link_libraries代码不需要做任何修改,开启开关后${OPENSSL_LIBRARIES}会自动指向对应路径下的libssl.a、libcrypto.a静态库,同时会自动追加OpenSSL依赖的pthread、dl等系统库,避免静态链接时出现符号未定义错误。 - 配置修改完成后,必须删除构建目录下的
CMakeCache.txt缓存文件,重新执行CMake配置流程,否则缓存中留存的旧动态库路径不会自动更新。
临时硬编码方案(仅适合调试)
如果需要临时指定静态库路径,必须将两个库的路径作为独立参数传入,不能放在同一个引号内拼接:
target_link_libraries(project PRIVATE "/usr/lib/x86_64-linux-gnu/libssl.a" "/usr/lib/x86_64-linux-gnu/libcrypto.a" )
硬编码路径的可移植性极差,更换OpenSSL安装路径、切换编译操作系统/发行版就会直接失效,不建议在正式项目中使用。
内容的提问来源于stack exchange,提问作者user997112
相关产品推荐
相关产品推荐

