Clang Xcode 11 ld错误“;您的二进制文件不是/usr/lib/libcrypto.dylib";

Clang Xcode 11 ld错误“;您的二进制文件不是/usr/lib/libcrypto.dylib";,clang,ld,xcode11,libcrypto,Clang,Ld,Xcode11,Libcrypto,我的项目使用CMake构建,但在Mac上构建时使用本地macOS版本的clang和ld 在macOS 10.15 Catalina上升级到Xcode 11后,我无法链接到以下错误:ld:无法直接链接到dylib/framework,您的二进制文件不是架构x86_64的/usr/libcrypto.dylib的允许客户端 这与新的应用程序公证有关吗?是否有一个修复程序不需要项目在Xcode中(我使用CLion在macOS上开发),或者不需要链接我自己构建的OpenSSL 感谢您的帮助。此页面帮助我

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

在macOS 10.15 Catalina上升级到Xcode 11后,我无法链接到以下错误:
ld:无法直接链接到dylib/framework,您的二进制文件不是架构x86_64的/usr/libcrypto.dylib的允许客户端

这与新的应用程序公证有关吗?是否有一个修复程序不需要项目在Xcode中(我使用CLion在macOS上开发),或者不需要链接我自己构建的OpenSSL


感谢您的帮助。

此页面帮助我解决了OpenSSL问题:

另见本页:

今天早上我自己偶然发现了这一问题,并四处挖掘,我发现这表明苹果打算只在内部使用这些类型的库。建议您自己构建第三方库,并将其包含在应用程序中。

我已经从brew安装了OpenSSL,
find_package
似乎检测到brew版本,但它尝试将项目与系统中安装的OpenSSL链接,即LibreSSL

我试图强制
find_包
设置库的确切路径,但它没有执行任何操作:

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

希望这有帮助

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,此黑客也无法修复它。

看起来twitter诗句提到这是“正常的”。基本上,包含的版本已经过时,所以现在它们只是阻止您链接到它。有人能半官方地证实或否认吗?今天早上,我自己偶然发现了这个问题,并四处挖掘,我发现了苹果论坛的一条消息,表明苹果打算只在内部使用这些类型的库。建议您自己构建第三方库,并将其包含在应用程序中@凯西,我认为这是正确的答案,正如我发现推特帖子时所怀疑的那样。您想将此作为答案发布,我会批准它吗?虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。感谢您提供的答案,不幸的是,它似乎与另一个问题有关,这在运行时链接到未版本的libcrypto时是一个例外。我要补充的是,提供的解决方案可能适用于开发,但对最终用户来说是可疑的,因为它需要修改客户端计算机才能运行应用程序,这不是你可以合理地要求应用程序用户执行的操作。嗨,我不清楚我需要编辑哪个文件来进行这些更改。非常感谢!谢谢,你救了我一天。