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

Dam*_*kis 13 clang ld libcrypto xcode11

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

任何帮助表示赞赏。

Mar*_*aux 13

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)
Run Code Online (Sandbox Code Playgroud)

确保清除 CMake 缓存,因为一旦找到路径错误的库,即使您在项目上重新运行 CMake,此 hack 也不会修复它。


Alv*_*nte 6

我已经从 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()
Run Code Online (Sandbox Code Playgroud)

所以我最终通过手动设置依赖项,这并不理想,但它同时适用于开发。

# 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()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!


Cas*_*sey 1

今天早上我自己遇到了这个问题并进行了深入研究,我发现了这条苹果论坛消息,该消息表明苹果打算仅在内部使用这些类型的库。建议您自己构建第三方库并将它们包含在您的应用程序中。