Error de Xcode 11 ld "su binario no es un cliente permitido de /usr/lib/libcrypto.dylib"

8

Mi proyecto usa CMake para compilar, pero usa la versión local de macOS de clang y ld cuando compila en una Mac.

Después de la actualización a Xcode 11 en MacOS 10.15 Catalina, soy incapaz de enlace con el siguiente error: ld: cannot link directly with dylib/framework, your binary is not an allowed client of /usr/lib/libcrypto.dylib for architecture x86_64.

¿Está relacionado con la nueva aplicación de notarización? ¿Hay alguna solución que no requiera que el proyecto esté en Xcode (uso CLion para desarrollar en macOS) o que no requiera vincular mi propia compilación de OpenSSL?

Cualquier ayuda apreciada.

Damien Sirkis
fuente
Parece que el verso de Twitter menciona que esto es "normal". Básicamente, la versión incluida estaba desactualizada, por lo que ahora solo evitan que se vincule a ella. ¿Alguien puede confirmar o negar semioficialmente? twitter.com/steipete/status/1168926846962020352
Damien Sirkis
Me encontré con este problema esta mañana y, mientras investigaba, me encontré con este mensaje del foro de Apple que indica que Apple tiene la intención de que este tipo de bibliotecas se usen solo internamente. El consejo es crear bibliotecas de terceros usted mismo e incluirlas con su aplicación. forums.developer.apple.com/thread/124782
Casey
1
@casey Creo que esa es la respuesta correcta, como sospeché cuando encontré la publicación de Twitter. ¿Quieres publicar esto como respuesta y lo aprobaré?
Damien Sirkis el

Respuestas:

1

Al encontrarme con este problema esta mañana y al investigar, me encontré con este mensaje del foro de Apple que indica que Apple tiene la intención de que este tipo de bibliotecas se usen solo internamente. El consejo es construir bibliotecas de terceros usted mismo e incluirlas con su aplicación.

Casey
fuente
3

He instalado OpenSSL desde brew, y find_packageparece detectar la versión de brew, pero intenta vincular el proyecto con el OpenSSL instalado en el sistema, que es LibreSSL.

Traté de forzar find_packagea establecer la ruta exacta de la biblioteca, pero no hace nada:

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

Así que terminé configurando las dependencias manualmente, lo que no es ideal, pero mientras tanto funciona para el desarrollo.

# 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()

La salida de Cmake proporciona esta información, donde detecta la biblioteca OpenSSL desde la preparación, pero se vincula con la biblioteca del sistema. No estoy seguro de por qué.

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

¡Espero que esto ayude!

Alvaro Luis Bustamante
fuente
Hola, estoy confundido sobre qué archivo necesito editar para hacer estos cambios. ¡Muchas gracias!
mikejw
1

Esta página me ayudó a resolver el problema de OpenSSL: https://gist.github.com/llbbl/c54f44d028d014514d5d837f64e60bac

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

LostByte
fuente
1
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
Agilanbu
1
Gracias por la respuesta, desafortunadamente parece estar relacionado con un problema diferente, que es una excepción cuando se vincula a un libcrypto no versionado en tiempo de ejecución. Agregaré que la solución provista puede funcionar para el desarrollo, pero es dudosa para los usuarios finales porque requiere modificar la computadora cliente para que la aplicación se ejecute, lo cual no es algo que razonablemente podría requerir un usuario de una aplicación.
Damien Sirkis
1

A medida que el FindOpenSSL.cmakecódigo busca las bibliotecas y luego almacena el resultado en la memoria caché de CMake, puede establecer la ruta de forma forzada antes de intentar encontrar OpenSSL. El FindOpenSSL.cmakecódigo no reemplazará su ruta.

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)

Asegúrese de borrar el caché de CMake, porque una vez que la biblioteca se encuentra con la ruta incorrecta, este truco no lo solucionará, incluso si vuelve a ejecutar CMake en su proyecto.

Martijn Courteaux
fuente