2012-04-26 6 views
11

Sto usando libcurl in un progetto Mac creato e compilato su OS 10.7 Lion. Posso collegarmi alla libreria dinamica senza problemi, usando l'opzione -lcurl in Altri Linker Flags o aggiungendo la libreria al mio progetto. Tutto funziona come dovrebbe.In Xcode, come faccio a collegare una libreria dinamica (libcurl) in modo che l'app funzioni anche su versioni precedenti di Mac OS?

Vorrei che l'applicazione funzionasse anche su OS 10.6 e 10.5. Ho impostato di conseguenza il target di implementazione. Quando vado a eseguire l'applicazione in una di quelle versioni del sistema operativo, viene visualizzato un errore dyld:

Libreria non caricata: /usr/lib/libcurl.4.dylib Motivo: versione della libreria non compatibile: X richiede la versione 7.0.0 o successivo, ma libcurl.4.dylib fornisce la versione 6.0.0.

È un problema simile per Mac OS 10.5.

Come posso eseguire il collegamento alla libreria libcurl del sistema in Xcode su Mac OS 10.7 in modo che l'applicazione venga eseguita anche su 10.6 e 10.5?

Ho guardato un paio di opzioni:

  1. Uno è quello di cambiare l'SDK Base, come suggerito in questo post: Mac OS X libcurl dylib compatibility version Se faccio questo, l'applicazione funziona bene. Ma questa non è un'opzione per me. Devo usare l'SDK 10.7, quindi la regressione a una versione precedente dell'SDK non è accettabile.

  2. Ho provato un collegamento debole con la libreria utilizzando l'opzione -weak_library /usr/lib/libcurl.dylib in Altri linker flag. L'applicazione si avvia ma poi si blocca quando provo a fare riferimento ai simboli libcurl. Tuttavia, so che non è un problema con il codice incompatibile perché funziona quando cambio l'SDK di base.

  3. Ho provato a caricare dinamicamente la libreria nel codice utilizzando dlopen ("libcurl.dylib", RTLD_LOCAL | RTLD_LAZY); La libreria sembra caricarsi, ma devo quindi legare manualmente tutti i simboli a cui faccio riferimento?

Sicuramente ci deve essere un modo per farlo. La libreria libcurl è installata su Mac OS 10.5, 10.6 e 10.7, ma l'applicazione non riesce a utilizzare la libreria disponibile su versioni precedenti di Mac OS. Come posso risolvere questo?

risposta

7

Alcune opzioni:

  • Passare dalla libcurl alle API framework Mac (CFNetwork, NSURLConnection, etc.)
  • Costruire e confezionare la propria versione di libcurl con la tua applicazione, piuttosto che fare affidamento sulla libreria di sistema .
  • Copiare o collegare simbolicamente la libreria stub dall'SDK corrispondente alla destinazione di distribuzione e collegarvi ad essa con un percorso esplicito.
+0

Grazie Ken. La prima opzione non funzionerà. Ho eseguito FTP tramite SSL e né CFNetwork né NSURLConnection lo supporta. Questo è stato sicuramente il primo posto che ho guardato. =) Preferirei sicuramente evitare di impacchettare la mia versione di libcurl con l'app, quindi esaminerò il link simbolico allo stub. La mia preoccupazione è che io abbia come target 10.5 e non so nemmeno se quell'SDK sia disponibile per Xcode 4.3 su Lion. – Philip

+1

Sto contrassegnando la tua risposta come corretta e raccomandando agli altri utenti di seguire la terza opzione. Una soluzione funzionante è infatti quella di acquisire una versione precedente dell'SDK e copiare libcurl.4.dylib da esso nel 10.7 Directory SDK - che ora è contenuta nel pacchetto dell'applicazione Xcode. Devi prima eseguire il backup dell'originale. Link Xcode contro quella versione della libreria mentre fornisci le intestazioni per la versione più recente in 10.7. Ciò significa che l'applicazione deve verificare la disponibilità dei simboli prima di utilizzarli nel codice. – Philip

Problemi correlati