我的项目使用CMake进行构建,但是在Mac上进行构建时使用本地的macOS版本的clang和ld。
在macOS 10.15 Catalina上升级到Xcode 11后,我无法链接以下错误:ld: cannot link directly with dylib/framework, your binary is not an allowed client of /usr/lib/libcrypto.dylib for architecture x86_64
。
这与新应用公证有关吗?是否有不需要该项目位于Xcode中的修补程序(我使用CLion在macOS上开发)或不需要链接我自己的OpenSSL构建?
任何帮助表示赞赏。
答案 0 :(得分:11)
在FindOpenSSL.cmake
代码中查找库,然后将结果存储在CMake缓存中时,可以在尝试查找OpenSSL之前强制设置路径。 FindOpenSSL.cmake
代码不会替换您的路径。
if (APPLE)
# This is a bug in CMake that causes it to prefer the system version over
# the one in the specified ROOT folder.
set(OPENSSL_ROOT_DIR ${OPENSSL_ROOT_DIR} /usr/local/Cellar/openssl@1.1/1.1.1g/)
set(OPENSSL_CRYPTO_LIBRARY ${OPENSSL_ROOT_DIR}/lib/libcrypto.dylib CACHE FILEPATH "" FORCE)
set(OPENSSL_SSL_LIBRARY ${OPENSSL_ROOT_DIR}/lib/libssl.dylib CACHE FILEPATH "" FORCE)
endif()
find_package(OpenSSL REQUIRED)
确保清除CMake缓存,因为一旦发现库路径错误,即使在项目上重新运行CMake,此hack也无法解决。
答案 1 :(得分:2)
我已经从brew安装了OpenSSL,find_package
似乎可以检测到brew版本,但是它尝试将项目链接到系统中安装的OpenSSL LibreSSL。
我试图强迫find_package
设置库的确切路径,但是它什么也没做:
if(APPLE)
set(OPENSSL_ROOT_DIR /usr/local/Cellar/openssl@1.1/1.1.1d/)
endif()
因此,我最终通过手动设置了依赖关系,这虽然不理想,但在开发的同时也可以使用。
# OpenSSL
find_package(OpenSSL REQUIRED)
if(OPENSSL_FOUND)
if(APPLE)
include_directories(/usr/local/Cellar/openssl@1.1/1.1.1d/include)
list(APPEND LIB_LIST /usr/local/Cellar/openssl@1.1/1.1.1d/lib/libssl.dylib)
list(APPEND LIB_LIST /usr/local/Cellar/openssl@1.1/1.1.1d/lib/libcrypto.dylib)
message(STATUS "OpenSSL Version: ${OPENSSL_VERSION} ${OPENSSL_INCLUDE_DIR} ${OPENSSL_LIBRARIES}")
else()
include_directories(${OPENSSL_INCLUDE_DIR})
list(APPEND LIB_LIST ${OPENSSL_LIBRARIES})
message(STATUS "OpenSSL Version: ${OPENSSL_VERSION} ${OPENSSL_INCLUDE_DIR} ${OPENSSL_LIBRARIES}")
endif()
endif()
Cmake输出提供此信息,在该信息中它从brew检测到OpenSSL库,但与系统库链接。不知道为什么。
-- OpenSSL Version: 1.1.1d /usr/local/Cellar/openssl@1.1/1.1.1d/include /usr/lib/libssl.dylib;/usr/lib/libcrypto.dylib
希望获得帮助!
答案 2 :(得分:0)
此页面帮助我解决了OpenSSL问题: https://gist.github.com/llbbl/c54f44d028d014514d5d837f64e60bac
答案 3 :(得分:0)
今天早上我自己碰到这个问题并四处寻找,我碰到了这个Apple forum message,它表明Apple打算将这些类型的库仅在内部使用。建议是自己构建第三方库,并将其包含在您的应用程序中。
答案 4 :(得分:0)
我以前遇到过这个问题。 解决方案 :- 转到构建文件夹:
$ rm -rf *
$ cmake -DOPENSSL_ROOT_DIR="/usr/local/opt/openssl@1.1" ..
$ cmake -DOPENSSL_LIBRARIES="/usr/local/opt/openssl@1.1/lib" ..
$ make