14

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

任何帮助表示赞赏。

4

5 回答 5

14

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

于 2020-05-28T11:16:05.883 回答
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()

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

# 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

希望这有帮助!

于 2019-11-30T11:04:57.337 回答
2

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

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

于 2019-10-23T08:25:39.157 回答
1

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

于 2019-11-05T21:36:58.060 回答
0

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

$ rm -rf *
$ cmake -DOPENSSL_ROOT_DIR="/usr/local/opt/openssl@1.1" ..
$ cmake -DOPENSSL_LIBRARIES="/usr/local/opt/openssl@1.1/lib" ..
$ make
于 2021-08-04T13:55:36.840 回答