2010-05-02 96 views
79

我知道CFLAGS(或CXXFLAGS for C++)是用於編譯器的,而CPPFLAGS是由預處理器使用的。CFLAGS vs CPPFLAGS

但我仍然不明白區別。

我需要指定#include包含的頭文件的包含路徑 - 因爲#include是預處理器指令,是預處理器(CPPFLAGS)是我唯一關心的事情嗎?

在什麼情況下我需要給編譯器一個額外的包含路徑?

一般來說,如果預處理器找到幷包含所需的頭文件,爲什麼需要告訴額外的包含目錄呢? CFLAGS有什麼用處?

(在我的情況,我居然發現這些BOTH讓我編譯我的程序,這增加了混亂......我可以使用CFLAGS OR CPPFLAGS實現我的目標(在autoconf的)至於

+1

可能重複http://stackoverflow.com/questions/495598/difference-between-cppflags-and-cxxflags-in-gnu -make – 2010-05-02 21:03:41

回答

120

編譯C程序中隱含的生成規則是

%.o:%.c 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

其中$()語法擴展變量。由於在編譯器調用中使用了CPPFLAGSCFLAGS,您用它來定義包含路徑是個人品味的問題。例如,如果foo.c是在當前目錄

make foo.o CPPFLAGS="-I/usr/include" 
make foo.o CFLAGS="-I/usr/include" 

文件都將打電話給你的編譯器以完全相同的方式,即

gcc -I/usr/include -c -o foo.o foo.c 

兩者之間的區別進場時,你有多種語言這就需要同包括路徑,例如,如果你有bar.cpp然後嘗試

make bar.o CPPFLAGS="-I/usr/include" 
make bar.o CFLAGS="-I/usr/include" 

那麼編譯會

g++ -I/usr/include -c -o bar.o bar.cpp 
g++ -c -o bar.o bar.cpp 

由於C++隱式規則也使用CPPFLAGS變量。

這種差異給你要使用一個很好的指南 - 如果你想的標誌被用於所有的語言把它放在CPPFLAGS,如果它是一個特定的語言把它放在CFLAGSCXXFLAGS等後者的例子鍵入包括標準符合性或警告標誌 - 您不希望將-std=c99傳遞給C++編譯器!

你可能再像這樣的東西最終會在你的makefile

CPPFLAGS=-I/usr/include 
CFLAGS=-std=c99 
CXXFLAGS=-Weffc++ 
+0

請注意,您不能使用'CPPFLAGS'運行獨立的'cpp',並期望得到任何合理的結果,因爲'-std = c99'會影響定義哪些符號(尤其是代替特性測試宏)。相反,您需要'$(CC)$(CPPFLAGS)$(CFLAGS)-E'。 – Jed 2013-01-14 16:06:09

2

你是在implicit make rules之後。

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/18639008) – Ctznkane525 2018-01-27 01:05:05

9

CPPFLAGS宏是用來指定#include目錄的宏。

在你的情況下,兩個CPPFLAGSCFLAGS的工作,因爲make(1)規則結合了預處理,並在一個命令編譯(所以這兩個宏在命令中使用)。

如果使用表格#include "...",則不需要指定.作爲include目錄。您也不需要指定標準的編譯器包含目錄。你確實需要指定所有其他的include目錄。

+0

這樣做更有意義,但我仍然沒有看到CFLAGS做什麼。如果像您似乎暗示的那樣,在更復雜的項目中進行編譯是在與預處理分開的一個步驟中完成的,則預處理將成功,但如果CFLAGS未添加與CPPFLAGS爲預處理器添加的相同路徑,編譯將失敗? 我想我不明白如果預處理器已經處理了#include指令,編譯器如何處理包含路徑? – EBM 2010-05-02 22:21:23

+3

@EB如果您正在編譯預處理文件,那麼包含路徑是不必要的 - 所需的頭文件已被添加到預處理的源文件中(當您在文件上運行'gcc -E'時查看輸出 - 沒有#包括)。大多數現代編譯器結合了預處理和編譯步驟,所以您不必擔心這一點。 – 2010-05-03 07:33:17