2009-11-18 8 views
7

Wir verwenden vorkompilierte Header mit GCC für unser Projekt und bauen sie wie folgt aus:vorkompilierte Header und Kompilieren Universal-Objekte auf OSX

gcc $(CFLAGS) precompiledcommonlib.h 

Jetzt baue ich das Projekt auf OSX 10.6 und versuchen, die raffinierte zu verwenden Merkmal zur gleichen Zeit wie dieser für alle Architekturen bauen:

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) 
:

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

aber es dies für den vorkompilierte Header nicht funktionieren scheint

Edit: Wie Mark nach XCode darauf hingewiesen hat, muss der vorkompilierte Header für jede Architektur separat erstellt werden, daher ist meine Frage eher, ob gcc den richtigen vorkompilierten Header beim Erstellen universeller Objekte verwenden kann.

Ich weiß, dass ich jede Architektur komplett getrennt bauen kann, wie XCode es tut, aber ich würde lieber die Möglichkeit nutzen, sie gleichzeitig zu bauen und nicht mit verschiedenen Build-Konfigurationen herumzualbern.

+0

Ich habe gerade versucht, das gleiche zu tun, und von dem, was ich sammeln , Sie _cannot_ erzeugen eine PCH-Datei, während Sie Apple GCC zwei '-Arch'-Flags geben.Die Qt-Leute scheinen etwas Seltsames zu tun, um dies zum Laufen zu bringen. Vielleicht möchten Sie es sich genauer ansehen ... http://qt.gitorious.org/qt/qt/merge_requests/2193 – Lucas

Antwort

2

Ich bin gerade auf die gleichen Fragen gestoßen und habe den Link von @lucas übernommen, also dachte ich mir, ich würde liefern, was ich hier gefunden habe.

Vor allem, wenn Sie Ihren gcc-Code von Linux auf MacOS portieren, erkennt die Version von gcc von Apple die .hpp-Dateierweiterung nicht richtig.

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 

Wie in einer anderen Antwort erwähnt, ist es am besten, das -x Argument angeben, dass gcc zu machen weiß, welche Art von Datei, die Sie kompilieren.

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

Dies erstellt die erwarteten test.hpp.gch.

Sie können eine beliebige Architektur auf der Befehlszeile angeben, und die GCH bauen richtig

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

oder

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

Wenn Sie mehr als eine Architektur zur Verfügung stellen, können Sie die Fehlermeldung erhalten, das Plakat erwähnt.

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) 

Der Schlüssel ist es, die Architekturen separat dann das -Xarch_ Argument verwenden müssen, kompilieren, die geeigneten während der Kompilierung zu laden:

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

Excellent find! Danke vielmals! – rasmusb

3

Ihr Problem ist nicht die Architekturen. Beide Fehler

Das Problem ist, dass Sie versuchen, eine ausführbare Datei ohne eine Hauptfunktion zu erstellen.

Da der Dateiname commonlib.c ist, vermute ich, dass Sie eine Bibliothek erstellen möchten, wenn dies der Fall ist, starten Sie das Projekt mit einer Bibliothek Vorlage in XCode.

+0

Vielen Dank, dass Sie sich die Zeit genommen haben. Versuchen Sie 'gcc foo.h'. Was gibt es aus? Denkst du immer noch, ich versuche eine ausführbare Datei zu erstellen? Eine hastige, ganz zu schweigen von schlicht falsche Antwort und eine herablassende Haltung ist keine besonders charmante Kombination. – rasmusb

+0

Ich habe die Befehlszeilen verwechselt sorry. Die Fehlermeldungen und die Befehlszeile versuchen jedoch, eine ausführbare Datei zu erstellen. - Deshalb ist ld die Befehlszeile, indem ich den Fehler gebe. Ich würde dies immer noch in Xcode einrichten, um alle Flags zu korrigieren. Wenn Sie das getan hätten, würde Apple sehen, dass Apple jeden Header für jede Architektur separat vorkompiliert und die Befehlszeile enthält -x objective-c-header -arch x86_64 Apple docs schlägt auch den Parameter -x vor. und Details zu separaten Architekturen. – Mark

+0

Guter Anruf. Ich bekomme diesen Fehler, wenn ich ein Projekt ohne Hauptmethode – surajz

Verwandte Themen