2009-11-18 2 views
7

Stiamo usando intestazioni precompilate con GCC per il nostro progetto e li costruiamo in questo modo:intestazioni precompilate e la compilazione di oggetti universali su OSX

gcc $(CFLAGS) precompiledcommonlib.h 

Ora sto costruendo il progetto su OSX 10.6 e cercando di utilizzare il nifty caratteristica di costruzione per tutte le architetture allo stesso tempo, in questo modo:

gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c 

Tuttavia, sembra che questo non funziona per le intestazioni precompilate:

gcc $(CFLAGS) -arch i386 -arch x86_64 precompiledcommonlib.h 
Undefined symbols for architecture i386: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
lipo: can't open input file: /var/folders/z1/z1A0sPkqGDyPrZWo9ysVK++++TI/-Tmp-//cc3W2gwd.out (No such file or directory) 

Modifica: Come Mark ha indicato come per XCode l'intestazione precompilata deve essere costruita separatamente per ogni architettura, quindi la mia domanda è piuttosto se c'è un modo per fare in modo che gcc usi l'intestazione precompilata giusta quando si costruiscono oggetti universali.

Mi rendo conto che potrei costruire ogni architettura completamente separata come fa XCode, ma preferirei piuttosto sfruttare la possibilità di costruirle nello stesso momento e non dover gironzolare con configurazioni di build diverse.

+0

ho solo cercato di fare lo stesso, e da quello che ho potuto capire , non si genera un file PCH mentre si assegnano due flag '-arch' di GCC di Apple.I ragazzi Qt sembrano fare qualcosa di strano per farlo funzionare, potresti voler controllare ... http://qt.gitorious.org/qt/qt/merge_requests/2193 – Lucas

risposta

2

Mi sono imbattuto nelle stesse domande e ho seguito il collegamento fornito da @lucas, quindi ho pensato di fornire quello che ho trovato qui.

Prima di tutto, se si esegue il porting del codice gcc da Linux a MacOS, la versione di gcc fornita da apple non rileva correttamente l'estensione di file .hpp.

mac:openstudio lefticus$ g++ test.hpp 
ld: warning: ignoring file test.hpp, file was built for unsupported file format which is not the architecture being linked (x86_64) 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

Come detto in un'altra risposta, è meglio specificare l'argomento -x per assicurarsi che gcc sappia che tipo di file che si sta compilando.

g++ -x c++-header test.hpp 

Questo crea l'attesa test.hpp.gch.

È possibile specificare qualsiasi architettura sulla riga di comando e la gch costruisce correttamente

g++ -x c++-header test.hpp -arch i386 

o

g++ -x c++-header test.hpp -arch x86_64 

Se si fornisce più di un'architettura, si ottiene l'errore il poster menzionato.

mac:openstudio lefticus$ g++ -xc++-header test.hpp -arch i386 -arch x86_64 
Undefined symbols for architecture i386: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
lipo: can't open input file: /var/folders/DM/DMTpbjzHHX08IEqGgEAORE+++TI/-Tmp-//ccDeWigf.out (No such file or directory) 

La chiave è quello di compilare le architetture necessari separatamente quindi utilizzare l'argomento -Xarch_ per caricare quella appropriata durante la compilazione:

g++ -x c++-header -arch x86_64 x86_64/test.hpp 
g++ -x c++-header -arch i386 i386/test.hpp 

g++ -arch i386 -arch x86_64 test.cpp -Xarch_i386 -Ii386 -Xarch_x86_64 -Ix86_64 
+0

Trova eccellente! Molte grazie! – rasmusb

3

Il tuo problema non sono le architetture. Entrambi non funzionano

Il problema è che si sta tentando di creare un eseguibile senza una funzione principale.

Dato che il nome del file è commonlib.c, ho il sospetto che vogliate creare una libreria se si avvia il progetto con un modello di libreria in XCode.

+0

Grazie per il tempo che ci hai dedicato. Prova 'gcc foo.h'. Cosa emette? Pensi ancora che sto provando a costruire un eseguibile? Una frettolosa, per non dire semplice risposta sbagliata e un atteggiamento condiscendente non è una combinazione particolarmente affascinante. – rasmusb

+0

Ho mescolato le righe di comando mi dispiace. Tuttavia, i messaggi di errore e la riga di comando stanno cercando di creare un eseguibile. - che è il motivo per cui ld è la riga di comando dando l'errore Vorrei ancora impostarlo in Xcode per ottenere tutte le bandiere corrette. Se lo avessi, vedresti che Apple precompila ogni intestazione separatamente per ogni architettura e la riga di comando include -x ogg-c-header -arch x86_64 Apple docs suggerisce anche il parametro -x. dettagli di amd su architetture separate. – Mark

+0

Buona chiamata. Ottengo quell'errore quando costruisco un progetto senza il metodo principale – surajz