Xcode 11 ld 错误 "your binary is not an allowed client of /usr/lib/libcrypto.dylib"

Xcode 11 ld error "your binary is not an allowed client of /usr/lib/libcrypto.dylib"

我的项目使用 CMake 构建,但在 Mac 上构建时使用本地 macOS 版本的 clang 和 ld。

在 macOS 10.15 Catalina 上升级到 Xcode 11 后,我无法 link 并出现以下错误: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 上开发)或不需要 link 我自己构建的 OpenSSL 的修复程序?

感谢任何帮助。

此页面帮助我解决了 OpenSSL 问题: https://gist.github.com/llbbl/c54f44d028d014514d5d837f64e60bac

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

运行 今天早上我自己进入这个问题并四处挖掘,我发现了这个 Apple forum message 这表明 Apple 打算仅在内部使用这些类型的库。建议是自己构建第三方库并将它们包含在您的应用程序中。

我已经从 brew 安装了 OpenSSL,find_package 似乎检测到 brew 版本,但它试图 link link 系统中安装了 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 库,但 link 检测系统库。不知道为什么。

-- OpenSSL Version: 1.1.1d /usr/local/Cellar/openssl@1.1/1.1.1d/include /usr/lib/libssl.dylib;/usr/lib/libcrypto.dylib

希望对您有所帮助!

由于 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 也无法修复它。

我以前遇到过这个问题。 解决方案 :- 去构建文件夹:

$ rm -rf *
$ cmake -DOPENSSL_ROOT_DIR="/usr/local/opt/openssl@1.1" ..
$ cmake -DOPENSSL_LIBRARIES="/usr/local/opt/openssl@1.1/lib" ..
$ make