Erro Xcode 11 ld “seu binário não é um cliente permitido de /usr/lib/libcrypto.dylib”

8

Meu projeto usa o CMake para compilar, mas usa a versão local do macOS do clang e ld ao compilar em um Mac.

Após a atualização para o Xcode 11 no MacOS 10.15 Catalina, eu sou incapaz de ligação com o seguinte erro: ld: cannot link directly with dylib/framework, your binary is not an allowed client of /usr/lib/libcrypto.dylib for architecture x86_64.

Isso está relacionado ao novo aplicativo de reconhecimento de firma? Existe uma correção que não exija que o projeto esteja no Xcode (eu uso o CLion para desenvolver no macOS) ou não exija vincular minha própria compilação do OpenSSL?

Qualquer ajuda apreciada.

Damien Sirkis
fonte
Parece que o verso do twitter menciona que isso é 'normal'. Basicamente, a versão incluída estava desatualizada e agora eles apenas impedem que você faça o link para ela. Alguém pode confirmar ou negar semi-oficialmente? twitter.com/steipete/status/1168926846962020352
Damien Sirkis
Ao me deparar com esse problema esta manhã e me aprofundar, deparei com uma mensagem no fórum da Apple que indica que a Apple pretende que esses tipos de bibliotecas sejam usados ​​apenas internamente. O conselho é criar você mesmo bibliotecas de terceiros e incluí-las no seu aplicativo. forums.developer.apple.com/thread/124782
Casey
1
@casey Acho que é a resposta correta, como suspeitei quando encontrei o post no twitter. Deseja postar isso como resposta e eu vou aprová-lo?
Damien Sirkis

Respostas:

1

Ao me deparar com esse problema esta manhã e me aprofundar, deparei com uma mensagem no fórum da Apple que indica que a Apple pretende que esses tipos de bibliotecas sejam usados ​​apenas internamente. O conselho é criar você mesmo bibliotecas de terceiros e incluí-las no seu aplicativo.

Casey
fonte
3

Instalei o OpenSSL a partir do brew e find_packageparece detectar a versão do brew, mas ele tenta vincular o projeto ao OpenSSL instalado no sistema, que é o LibreSSL.

Eu tentei forçar o find_packagepara definir o caminho exato da biblioteca, mas isso não faz nada:

if(APPLE)
    set(OPENSSL_ROOT_DIR /usr/local/Cellar/[email protected]/1.1.1d/)
endif()

Então, acabei definindo as dependências manualmente, o que não é o ideal, mas funciona enquanto isso para o desenvolvimento.

# OpenSSL
find_package(OpenSSL REQUIRED)
if(OPENSSL_FOUND)
    if(APPLE)
        include_directories(/usr/local/Cellar/[email protected]/1.1.1d/include)
        list(APPEND LIB_LIST /usr/local/Cellar/[email protected]/1.1.1d/lib/libssl.dylib)
        list(APPEND LIB_LIST /usr/local/Cellar/[email protected]/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()

O Cmake Output fornece essas informações, onde detecta a biblioteca OpenSSL do brew, mas vincula-se à biblioteca do sistema. Não sei por que.

-- OpenSSL Version: 1.1.1d /usr/local/Cellar/[email protected]/1.1.1d/include /usr/lib/libssl.dylib;/usr/lib/libcrypto.dylib

Espero que esta ajuda!

Alvaro Luis Bustamante
fonte
Oi, estou confuso qual arquivo eu preciso editar para fazer essas alterações. Muito Obrigado!
mikejw 10/03
1

Esta página me ajudou a resolver o problema do OpenSSL: https://gist.github.com/llbbl/c54f44d028d014514d5d837f64e60bac

Consulte também esta página: https://forums.developer.apple.com/thread/119429

LostByte
fonte
1
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
Agilanbu 23/10/19
1
Obrigado pela resposta. Infelizmente, parece estar relacionado a um problema diferente, que é uma exceção ao vincular a um libcrypto não-versionado em tempo de execução. Acrescentarei que a solução fornecida pode funcionar para o desenvolvimento, mas é duvidosa para os usuários finais, pois requer a modificação do computador cliente para que o aplicativo seja executado, o que não é algo que você poderia razoavelmente exigir de um usuário de um aplicativo.
Damien Sirkis
1

Como o FindOpenSSL.cmakecódigo procura as bibliotecas e armazena o resultado no cache do CMake, você pode definir o caminho à força antes de tentar encontrar o OpenSSL. O FindOpenSSL.cmakecódigo não substituirá o seu caminho.

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/[email protected]/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)

Certifique-se de limpar o cache do CMake, porque uma vez que a biblioteca é encontrada com o caminho errado, esse hack não o corrigirá, mesmo se você executar o CMake novamente em seu projeto.

Martijn Courteaux
fonte