Xcode 11 ldエラー「あなたのバイナリは/usr/lib/libcrypto.dylibの許可されたクライアントではありません」


8

私のプロジェクトは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ビルドをリンクする必要がない修正はありますか?

助けてくれてありがとう。


twitter-verseがこれは「正常」であると述べているようです。基本的に、含まれているバージョンは古くなっているので、リンクすることができなくなります。誰かが半公式に確認または拒否できますか?twitter.com/steipete/status/1168926846962020352
Damien Sirkis

今朝私自身がこの問題に遭遇し、いろいろ調べてみたところ、Appleがこれらのタイプのライブラリーを内部でのみ使用することを意図していることを示すこのAppleフォーラムメッセージに出くわしました。アドバイスは、サードパーティのライブラリを自分で構築し、それらをアプリケーションに含めることです。forums.developer.apple.com/thread/124782
ケーシー

1
@casey正しい答えだと思います。Twitterの投稿を見つけたときに疑いました。これを回答として投稿し、承認しますか?
Damien Sirkis

回答:


1

今朝自分でこの問題に出くわして、いろいろ調べてみたところ、Appleがこれらのタイプのライブラリを内部でのみ使用することを意図していることを示すこのAppleフォーラムメッセージに出くわしました。アドバイスは、サードパーティのライブラリを自分で構築し、それらをアプリケーションに含めることです。


3

私は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

この助けを願っています!


こんにちは、これらの変更を行うためにどのファイルを編集する必要があるか混乱しています。どうもありがとう!
mikejw

1

このページは、OpenSSLの問題を解決するのに役立ちました:https : //gist.github.com/llbbl/c54f44d028d014514d5d837f64e60bac

こちらのページもご覧ください:https : //forums.developer.apple.com/thread/119429


1
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
アギランブ

1
回答をありがとうございます。残念ながら、これは別の問題に関連しているようです。これは、バージョン管理されていないlibcryptoに実行時にリンクする場合の例外です。提供されたソリューションは開発に役立つ可能性がありますが、アプリを実行するためにクライアントコンピューターを変更する必要があるため、エンドユーザーにとっては疑わしいものです。これは、アプリのユーザーが合理的に必要とするものではありません。
Damien Sirkis、

1

FindOpenSSL.cmakeあなたはOpenSSLを見つけることを試みる前に、コードライブラリを探し、CMakeのキャッシュに結果を保存するには、強制的にパスを設定することができます。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キャッシュを必ずクリアしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.