2012-04-26 14 views
11

Estoy utilizando libcurl en un proyecto de Mac creado y compilado en OS 10.7 Lion. Puedo vincularme a la biblioteca dinámica muy bien, usando la opción -lcurl en Otros marcadores o agregando la biblioteca a mi proyecto. Todo funciona como se supone que debe hacerlo.En Xcode, ¿cómo puedo vincular una biblioteca dinámica (libcurl) para que la aplicación también funcione en versiones anteriores de Mac OS?

Me gustaría que la aplicación también funcione en OS 10.6 y 10.5. Establecí el objetivo de implementación en consecuencia. Cuando voy a ejecutar la aplicación en una de esas versiones del sistema operativo, aparece un error dyld:

Biblioteca no cargada: /usr/lib/libcurl.4.dylib Motivo: Versión de biblioteca incompatible: X requiere la versión 7.0.0 o posterior, pero libcurl.4.dylib proporciona la versión 6.0.0.

Es un problema similar para Mac OS 10.5.

¿Cómo puedo enlazar con la biblioteca libcurl del sistema en Xcode en Mac OS 10.7 para que la aplicación también se ejecute en 10.6 y 10.5?

He mirado en un par de opciones:

  1. Una de ellas es cambiar el SDK de Base, como se sugiere en este post: Mac OS X libcurl dylib compatibility version Si hago esto, la aplicación funciona bien. Pero esta no es una opción para mí. Debo utilizar el 10.7 SDK, por lo que no es aceptable realizar una regresión a una versión anterior del SDK.

  2. He intentado enlaces débiles contra la biblioteca utilizando la opción -weak_library /usr/lib/libcurl.dylib en otros indicadores de enlaces. La aplicación se inicia pero luego falla cuando trato de hacer referencia a los símbolos libcurl. Sin embargo, sé que no es un problema con el código incompatible porque funciona cuando cambio el SDK base.

  3. He intentado cargar dinámicamente la biblioteca dentro del código usando dlopen ("libcurl.dylib", RTLD_LOCAL | RTLD_LAZY); La biblioteca parece cargarse, pero entonces debo vincular manualmente todos los símbolos que hago referencia?

Seguramente debe haber una forma de hacerlo. La biblioteca libcurl está instalada en Mac OS 10.5, 10.6 y 10.7, pero la aplicación no puede usar la biblioteca disponible en las versiones anteriores de Mac OS. ¿Cómo puedo arreglar esto?

Respuesta

7

Algunas opciones:

  • Cambiar de libcurl a la API de estructura MAC (CFNetwork, NSURLConnection, etc.)
  • Construir y empaquetar su propia versión de libcurl con su aplicación en lugar de confiar en la biblioteca del sistema .
  • Copie o enlace simbólico de la biblioteca de código auxiliar del SDK correspondiente a su destino de despliegue y vincule con una ruta explícita.
+0

Gracias Ken. La primera opción no funcionará. He ejecutado FTP a través de SSL y ni CFNetwork ni NSURLConnection lo admiten. Ese fue definitivamente el primer lugar que miré. =) Definitivamente preferiría evitar empacar mi propia versión de libcurl con la aplicación, así que voy a analizar el enlace simbólico del código auxiliar. Mi preocupación es que estoy apuntando a 10.5, y ni siquiera sé si ese SDK está disponible para Xcode 4.3 en Lion. – Philip

+1

Estoy marcando su respuesta como correcta y recomendando a otros usuarios que sigan la tercera opción. Una solución de trabajo es, de hecho, adquirir una versión anterior del SDK y copiar el libcurl.4.dylib del mismo en el 10.7 directorio SDK - que ahora se encuentra dentro del paquete de la aplicación Xcode. Primero debe hacer una copia de seguridad del original. Xcode se vincula con esa versión de la biblioteca y le proporciona encabezados para la versión más reciente en 10.7. Esto significa que la aplicación debe verificar la disponibilidad de los símbolos antes de usarlos en el código. – Philip

Cuestiones relacionadas