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
运行 今天早上我自己进入这个问题并四处挖掘,我发现了这个 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
我的项目使用 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
运行 今天早上我自己进入这个问题并四处挖掘,我发现了这个 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