2013-01-01 13 views
3

在Xcode中,所有目標的構建設置從項目的構建設置繼承。該項目的構建設置繼承自「iOS默認」。該繼承如下所示級別選擇而不是合併編輯構建設置模板的iOS默認「(和「的Mac OS X」)

對於那些誰不知道,在項目設置粗體項指示覆蓋。通過突出顯示該設置,然後按下COMMAND-BACKSPACE,可以「覆蓋」覆蓋。

enter image description here

它得到真的老不斷變化的每一個不平凡的項目,我創造的價值。特別是像其他C標誌,我必須添加-Wall -Wextra -Wconversion -wstrict-overflow預處理器宏是另一個必須始終固定以包含Posix的NDEBUG=1。我肯定會考慮缺乏釋放NDEBUG=1構建了一個錯誤,因爲POSIX要求NDEBUG去除由assert()abort();和蘋果的UI標準不允許abort()。 (DEBUG=1類似的調試版本,因爲這麼多使用它儘管只的Posix標準NDEBUG)。

從下面@Petesh,我知道我可以使用配置爲每個項目(或許創造了一次,並重新使用它)。但這意味着我正在應用「正確」或「正確」設置來掩蓋「IOS默認」模板中的缺陷設置。我的意圖是一勞永逸地解決問題的根源。

如何編輯默認設置模板?文件系統上是否存在表示「iOS默認」的物理文件?如果是這樣,是否可以編輯(是XML)?

UPDATE:基於@ Peresh的答案(沒有磁盤文件永久解決該問題):雷達12941954.它可能會坐在蘋果的未經證實的,沒有答案,並且不固定多年來錯誤報告系統,就像其他像我和其他人一樣的錯誤的人花時間來報告。

+0

你可以使用一個「構建配置」文件導入所有這些設置 - 請參閱幫助的Xcode「上的配置文件立足構建配置」。 – Petesh

回答

3

構建配置文件是選擇用於預處理/編譯的一組選項的理想方法 - 使用.xcconfig文件以及您想要作爲基礎的設置,然後爲目標選擇此基本配置。

該文件需要在項目的基地創建,名爲TargetType.xcconfig。對於你的基地編譯器標誌要求,您可以使用文件與內容:

OTHER_CFLAGS = -Wall -Wextra -Wconversion -wstrict-overflow 

一旦你立足於.xcconfig文件的目標,它會得到這些選項爲默認項規定的所有目標。

您可以添加一個用於每個調試和釋放,允許的NDEBUG=1DEBUG=1選項規範例如

GCC_PREPROCESSOR_DEFINITIONS = NDEBUG=1 

將應用此設置到配置。

看看在Basing a Build Configuration on a Configuration File Xcode的幫助。在線上還有a tutorial這個過程。

我已使用gcc/g++規範文件來操作gcc的默認編譯器選項。如果您使用LLVM的gcc驅動程序,這仍然有效。默認的編譯器選項來自未修改的spec文件 - 即它是內置於編譯器中的,並不駐留在磁盤上。這個過程是:

gcc -dumpspecs > specs 
specdir=$(gcc -print-search-dirs | sed -n 's/install: //p') 
sed 's/^\(.*mdynamic-no-pic:-fPIC\)/<default options here> \1/' specs > newspecs 
sudo cp newspecs $specdir/specs 

您可以驗證spec文件正在被使用做:

gcc -v <file> 

,它應該顯示類似:

Reading specs from /Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/specs 

而不是

Using built-in specs. 

This can t裝配工混亂,這些標誌將影響所有gcc/g++彙編 - 即使是macports包,這意味着它們可能無法正確編譯。

clang/clang++,不幸的是沒有specfile的概念,因此在編譯時會忽略這個文件 - 它使用的所有選項都是在clang構建時定義的。在這種情況下,沒有辦法操作默認編譯器選項,因爲它不會嘗試讀取磁盤上的文件來確定默認編譯器選項。

+0

謝謝。所以,不要採取這種錯誤的方式,但我不想用適當的設置覆蓋每個項目的有缺陷的配置設置。我想解決的缺陷設置的來源,這將是「iOS的」默認」 – jww

+0

你可以用spec文件的'gcc' /'摹futz ++' - 。這允許更改默認的編譯選項爲編譯器我不「T認爲有對'clang'等效的,雖然。 – Petesh

+0

通過此評論,我的意思是默認的編譯設置所固有的編譯器,而不是xcode的。 – Petesh