Qual è il modo corretto per configurare gli spazi di lavoro XCode 4 per creare dipendenze quando necessario?

Il mio caso è semplice, uno spazio di lavoro con due progetti di pari livello: un’app principale (iOS) e un progetto che costruisce diversi target di librerie statiche utilizzate dall’app.

Ecco come ho configurato la build:

  • indicato un “percorso di ricerca dell’intestazione utente” nelle impostazioni di costruzione dell’app principale nella posizione del progetto della libreria (tramite un albero di sorgenti)
  • nell’editor del target principale della mia app -> fasi di creazione -> sezione “Collega binari con librerie”, ho aggiunto i prodotti della libreria che voglio utilizzare.
  • nello schema, spuntato ‘Trova dipendenze implicite’

Dopo una pulizia (e la cancellazione dei dati derivati), una build mi restituisce questo errore durante la creazione del progetto principale:

ld: library not found for -lChipmunk clang: error: linker command failed with exit code 1 (use -v to see invocation) Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1 

Certo, se guardo i dati derivati ​​appena creati, gli unici file object da trovare sono per l’app principale, non per le librerie. Un “find” diffuso per i file * .o non rivela nulla di rilevante, quindi le librerie non si perdono, sicuramente non sono in costruzione.

Alcuni punti supplementari:

  • quando ho chiesto informazioni su questo nei forum di sviluppo di Apple, è stato suggerito di aggiungere dei depl espliciti nell’editor Fasi di costruzione del target-> Target Dipendenze. Ma puoi aggiungere solo deps qui alle destinazioni nello stesso progetto o sottoprogetti; nel mio caso ho i progetti di app e di biblioteca come fratelli sul posto di lavoro.
  • se costruisco ciascuna libreria manualmente prima della build principale, tutto va bene.

Aggiornare:

Ho appena trovato una soluzione alternativa, ovvero aggiungere tutti gli obiettivi di deps nella parte “build” dello schema dell’app principale. Ci avevo già provato senza successo, ma non mi ero reso conto che avrei potuto trascinare gli obiettivi nella lista per ottenere il giusto ordine di costruzione. Le build ora avvengono nell’ordine corretto, sia dopo una pulizia, sia dopo le modifiche nella libreria o nella sorgente dell’app principale.

Lascio la domanda qui, perché sicuramente l’ordinamento manuale di un ordine di costruzione non dovrebbe essere necessario. Deve esserci qualcosa di sbagliato nel modo in cui ho impostato le cose.

La modifica dello schema (lo scambio di obiettivi di compilazione, un- / check “Parallelize Build” e / o “Find Implicit Dipendenze”) non ha funzionato per me. Dovevo ancora pulire il progetto, dopo ogni cambio di codice nella lib statica. Cercando i forum di sviluppo, ho finalmente trovato questa risposta , che ha funzionato a meraviglia.

Assicurati che l’ispettore Identity framework e Tipo sia visualizzato e seleziona il file libWhatever.a nel progetto dell’applicazione (non nella libreria). Se vedi Location: Relative a Project [o Relative to Group], questo è il tuo problema.

  1. Fare clic su Relativo a progetto e cambiarlo in Relativo per creare prodotti.
  2. Questo cambierà il tipo di link, ma sarà comunque rotto.
  3. Fare clic sul pulsante locate e trovare il file di output.

Aggiungendo una lib statica a un progetto esistente tramite Fasi di creazione -> Collega binario con le librerie automaticamente lo rende “Relativo al gruppo” (se entrambi sono fratelli nello stesso spazio di lavoro). Cambiando la sua posizione come descritto sopra risolve il problema della dipendenza della build e nel navigatore del progetto il tuo file .a dovrebbe apparire in lettere nere (invece che in rosso).

Ho descritto il modo in cui ho impostato più progetti in uno spazio di lavoro qui: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/

Concordo sul fatto che la regolazione manuale dell’ordine di destinazione nello schema non sia necessaria, in base alla documentazione di Xcode, ma questa è la soluzione migliore che ho trovato finora.


Modifica: quando ansible, ti consiglio di utilizzare https://github.com/CocoaPods/CocoaPods per gestire le dipendenze del progetto a questo punto.

Prova a trascinare il progetto della biblioteca nel progetto principale:

riferimento al progetto della biblioteca all'interno del progetto principale

Nel mio caso, l’unico modo in cui potrei avere la configurazione di configurazione di pari livello è aggiungendo manualmente il percorso “../MyLibProject/build/Debug-iphoneos” (controllando ricorsivamente solo per essere sicuri) nelle mie Impostazioni di compilazione -> Percorsi di ricerca della libreria. L’aggiunta del file .a nel solo progetto Main non ha impedito l’errore “lib not found” al momento del collegamento.