2013-07-04 22 views
11

Nel mio progetto iOS ho bisogno di utilizzare una libreria esterna scritta in C++. I file di intestazione C++ sono tutti in una directory.Utilizzo di intestazioni C++ esterne in Objective-C

Ho aggiunto queste intestazioni C++ al mio progetto Xcode e ho anche specificato un percorso di ricerca dell'intestazione (in Impostazioni di compilazione).

Il problema è che queste intestazioni C++ si includono l'una con l'altra utilizzando le parentesi angolari <>. Il risultato è:

'filename.h' file not found with <angled> include, use "quotes" instead. 

La cosa strana è che Xcode non si lamenta di tutte le intestazioni. Anche la stessa intestazione # include'd in un file va bene, mentre un problema quando # include'd in un altro. Penso che questo sia causato dal fatto che queste intestazioni si includono a vicenda.

  1. Perché il percorso di ricerca non funziona?
  2. C'è un modo per risolvere questo problema senza modificare questi file di intestazione?

Grazie!

+0

Avete i sorgenti e il progetto Xcode di quella libreria C++? – CouchDeveloper

+0

@CouchDeveloper No, non lo faccio. –

+4

L'impostazione dei parametri "Cerca sempre percorsi utente" aiuta? –

risposta

26
#include <bla.h> 

è significato per la biblioteca o di un quadro intestazioni standard, e la strategia di ricerca è diverso da quello usato per

#include "bla.h" 

Si veda ad esempio

Come soluzione, puoi impostare t l'impostazione di creazione Xcode "Cerca sempre percorsi utente" su SÌ.

+1

Nota che l'impostazione "Cerca sempre percorsi utente" su SÌ può causare problemi di intestazione. Si consiglia vivamente di impostarlo su NO, e questo è il modo corretto. È ancora lì solo per le retrocompatibilità. Le intestazioni della libreria di terze parti dovrebbero essere incluse tramite parentesi angolari. – CouchDeveloper

+0

@CouchDeveloper: era pensato come soluzione alternativa, ma hai ragione e la tua risposta è probabilmente la soluzione migliore. –

+0

@CouchDeveloper concorda sul fatto che questa impostazione dovrebbe essere impostata su NO, ma c'è qualcosa di indesiderabile che imposta questa impostazione su SÌ nel contesto della creazione di un framework incorporato? –

11

Partendo da un progetto di applicazione "in bianco":

  1. creare una cartella "Librerie" nel progetto dell'applicazione - preferibili come un fratello al file MyApp.xcodeproj, ma può essere ovunque. Crea sottocartelle per ogni configurazione (Debug, Release, ecc.) E possibilmente per ogni architettura (armv7, armv7s, arm64) a meno che il binario non sia un archivio binario universale contenente tutte le architetture.

  2. Ottieni le intestazioni della libreria di terze parti e i file binari delle librerie statiche (possibilmente più di una per piattaforme, configurazioni e architetture diverse) e spostali nella cartella "Libreria" in corrispondenti sottocartelle (che potrebbe essere necessario creare):

    per esempio, supponendo che hai avuto un binario universale (ARMv7, armv7s, arm64) e Debug e Release versioni di quella libreria: Ora, la struttura delle cartelle si presume essere la seguente:

    $(SRCROOT)/Libraries 
        Debug-iphoneos 
         include 
          ThirdParty 
           third_party.hh 
           ... 
         libThirdParty.a    
        Release-iphoneos 
         include 
          ThirdParty 
           third_party.hh 
           ... 
         libThirdParty.a    
    MyApp.xcodeproj    
    
  3. "Percorsi di ricerca della libreria" Build Se tza:

    Trascinare la cartella "Librerie" nel progetto Xcode. Questo può creare automaticamente un percorso di ricerca di libreria nelle impostazioni di generazione. Si prega di verificare questo, e se non è corretto, risolverlo.

    Dato l'esempio, aggiungere i seguenti percorsi di ricerca delle biblioteche per Debug e Release configurazione:

    Debug: Biblioteca dei percorsi di ricerca: $(SRCROOT)/Libraries/Debug-iphoneos

    di uscita: Biblioteca dei percorsi di ricerca: $(SRCROOT)/Libraries/Release-iphoneos

    È possibile che siano disponibili percorsi di ricerca di libreria diversi per particolari coppie di piattaforme di configurazione e di destinazione. Imposta di conseguenza il percorso diverso nell'impostazione di generazione.

  4. "Header Percorsi di ricerca" Costruire Ambito:

    Dato l'esempio, aggiungere il seguente percorso di ricerca di intestazione per il debug e la configurazione di rilascio:

    Debug: Header percorsi di ricerca: $(SRCROOT)/Libraries/Debug-iphoneos/include

    Stampa: intestazione dei percorsi di ricerca: $(SRCROOT)/Libraries/Release-iphoneos/include

    Allo stesso modo, potresti avere percorsi diversi per particolari coppie di Config/Target - sebbene le intestazioni possano essere le stesse.

  5. Collegare l'app alla libreria standard C++ aggiungendo -lc++ alle Altre impostazioni di Linker build.

  6. Importa l'intestazione nei file come segue:

    #import <ThirdParty/third_party.hh> 
    
+0

Questo ha aiutato, dal momento che l'errore era dipendente dal target nel mio caso. –

+0

Epic, la prima volta che riesco a fare l'angolo include il lavoro con una libreria di terze parti che ho nel mio progetto perché voglio correggerla. Grazie. – aledalgrande

1

In XCode dopo aver impostato l ' "utente Header Percorsi di ricerca" per puntare alla directory di libreria, si hanno anche per assicurarsi che un campo chiamato "Cercare sempre User Percorsi" è impostato su "Yes"

Questo ha risolto il problema che stavo avendo: con <boost/signals2.hpp> file non trovato con <angolato> includono, usare "virgolette" anziché.

1

In Xcode 9, è necessario aggiungere il percorso dei file di intestazione all'impostazione di build Header Search Paths, non User Header Search Paths.

Xcode aggiungerà User Header Search Paths per compilare il comando come opzioni -iquote, ma aggiungere Header Search Paths come -I opzioni. Questa è la differenza fondamentale.

+0

Grazie per aver segnalato questo. (Non avevo ancora il tempo di controllarlo, mi fido di te.) –