Xcode 11 ld错误“您的二进制文件不是/usr/lib/libcrypto.dylib的允许的客户端”

时间:2019-10-18 07:49:43

标签: clang ld xcode11 libcrypto

我的项目使用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构建?

任何帮助表示赞赏。

5 个答案:

答案 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

另请参阅以下页面: https://forums.developer.apple.com/thread/119429

答案 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