2014-01-24 36 views
2

在SCons環境中同時使用CCFLAGS和SHCCFLAGS變量的原因是什麼?scons在ccflags和shccflags之間的區別

我想修改一個大的程序構建,我沒有自己寫。當我添加命令:

env.Append(CCFLAGS=["-I%s" % amber_dir, "-DAMBER"]) 

編譯器運行沒有我添加的標誌。但是當我做

env.Append(SHCCFLAGS=["-I%s" % amber_dir, "-DAMBER"]) 

編譯器添加我的標誌爲所需。在SCons的內部某處,CCFLAGS沒有傳遞給SHCCFLAGS。但爲什麼要有CCFLAGS和SHCCFLAGS?

回答

2

這是從SCons的用戶指南採取:SCons Construction Variable

CCFLAGS

傳遞給C和C++編譯器

常規選項。

CPPFLAGS

用戶指定的C預處理器選項。這些將包含在使用C預處理器的任何 命令中,包括通過$ CCCOM,$ SHCCCOM,$ CXXCOM和 $ SHCXXCOM命令行編譯C和C++源文件的不僅包括編譯 ,還包括$ FORTRANPPCOM,$ SHFORTRANPPCOM , 用於編譯Fortran 源文件的$ F77PPCOM和$ SHF77PPCOM命令行,以及通過 C預處理器首次運行每個文件後,用於彙編 彙編語言源文件的$ ASPPCOM命令行。請注意,此變量不包含-I(或 類似)包含搜索路徑選項,scons從$ CPPPATH自動生成 。請參閱下面的$ _CPPINCFLAGS,以瞭解擴展到這些選項的 變量。

SHCCFLAGS傳遞給C和C++編譯器來生成 共享庫對象

選項。

SHCCCOM

用於編譯C源文件到一個共享庫 對象文件的命令行。在此命令行中包含在$ SHCFLAGS,$ SHCCFLAGS和 $ CPPFLAGS構造變量中指定的任何選項。

上述4中最有趣的是SHCCCOMCPPFLAGS變量。再次嘗試設置CPPFLAGS而不是CCFLAGS

關於您正在設置的標誌的一般註釋:對於SCons,其通常更適合設置包含CPPPATH變量的路徑,並且設置爲使用CPPDEFINES定義。當使用這些變量時,您不需要包含-I-D標誌,SCons將以平臺無關的方式爲您添加它。這裏有一個例子:

env.Append(CPPPATH=amber_dir) 
env.Append(CPPDEFINES='AMBER') 

你需要測試以查看是否共享對象()和/或SharedLibrary()製造商使用這些,我會想象他們會。

答案在下面的評論的問題:

SHCCCOM只是用來看看有什麼命令行的樣子,有時你可能需要使用它,而不直接使用SCons的建設者。 SHCCFLAGSCPPFLAGS和其他的超集,如果您只有標記只能傳遞給SharedLibrary()SharedObject(),應該使用它。 CPPFLAGS適用於靜態和共享編譯。

+0

謝謝,一切都按照你的建議工作。但仍然感到困惑:我應該什麼時候使用CPPFLAGS,何時應該使用SHCCFLAGS,何時應該使用SHCCCOM?這僅僅是個人偏好,還是有理由相互使用? – Pawelek

+0

@Pawelek,我更詳細地更新了答案。 – Brady