2009-11-18 94 views
7
編譯通用對象

我們正在使用預編譯的頭與GCC爲我們的項目,並建立他們是這樣的:預編譯頭和OSX

gcc $(CFLAGS) precompiledcommonlib.h 

現在我建立在OSX 10.6的項目,並嘗試使用漂亮

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

但似乎這並沒有對預編譯頭工作:

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) 
,同時這樣的建設對所有架構的特點

編輯: 正如Mark指出的那樣,根據XCode,預編譯頭文件必須爲每個架構分別構建,所以我的問題是,如果有任何方法讓gcc在構建通用對象時使用正確的預編譯頭文件。

我意識到我可以像XCode那樣完全分離構建每個架構,但我更願意利用可能性來同時構建它們,而不必混淆不同的構建配置。

+0

我只是試圖做同樣的,從我可以收集,你不能在給Apple的GCC兩個'-arch'標誌時生成一個PCH文件。Qt人似乎正在做一些奇怪的事情,讓這個工作,你可能想檢查出來... http://qt.gitorious.org/qt/qt/merge_requests/2193 – Lucas 2010-02-07 17:25:18

回答

2

我剛剛遇到了相同的問題,並跟進了@lucas提供的鏈接,所以我想我會提供我在這裏找到的。

首先需要注意的是,如果您將gcc代碼從Linux移植到MacOS,蘋果提供的gcc版本無法正確檢測到.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 

作爲另一個答覆中提到,這是最好的指定-x參數,以確保海合會知道你正在編譯什麼類型的文件。

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

這產生了預期的test.hpp.gch

你可以在命令行中指定的架構和GCH正確構建

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

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

如果你提供一個以上的建築,你得到的海報中提到的錯誤。

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) 

關鍵是要編譯你需要單獨再使用-Xarch_參數在編譯期間加載合適的體系結構:

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

非常好找!非常感謝! – rasmusb 2012-01-14 15:21:45

3

您的問題不在於架構。兩者都失敗

問題是,您正在嘗試構建不帶main函數的可執行文件。

由於文件名是commonlib.c我懷疑你想要建立一個庫,如果是這樣的話,用XCode中的庫模板啓動項目。

+0

感謝您花時間。 嘗試'gcc foo.h'。它輸出什麼?你還認爲我正在嘗試構建一個可執行文件嗎? 草率的,更不用說平淡的錯誤答案和光顧的態度並不是一個特別迷人的組合。 – rasmusb 2009-11-18 22:19:14

+0

我確實混淆了命令行抱歉。但是,錯誤消息和命令行正在嘗試構建可執行文件。 - 這就是爲什麼ld是命令行通過給出錯誤 我仍然會在Xcode中設置它以使所有標誌都正確。如果您希望Apple爲每個架構分別預編譯每個頭文件,並且命令行包含-x objective-c-header -arch x86_64 Apple文檔也會提示-x參數。 amd在單獨的架構上的細節。 – Mark 2009-11-19 12:19:01

+0

良好的通話。當我建立一個沒有主要方法的項目時,我得到這個錯誤 – surajz 2011-03-19 16:54:21