scons在ccflags和shccflags之间的区别

时间:2014-01-24 23:15:19

标签: scons

在SCons环境中同时拥有CCFLAGS和SHCCFLAGS变量的原因是什么?

我正在尝试修改我自己没有编写的大型程序构建。当我添加命令时:

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

编译器在没有添加标志的情况下运行。但是当我做的时候

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

编译器根据需要添加我的标记。在SCons的内部某处,CCFLAGS没有传递给SHCCFLAGS。但是为什么要开始使用CCFLAGS和SHCCFLAGS?

1 个答案:

答案 0 :(得分:2)

这取自SCons用户指南:SCons Construction Variable

  

CCFLAGS

     

传递给C和C ++编译器的常规选项。

     

CPPFLAGS

     

用户指定的C预处理器选项。这些将包括在任何   使用C预处理器的命令,不仅包括编译   通过$ CCCOM,$ SHCCCOM,$ CXXCOM和.C和C ++源文件   $ SHCXXCOM命令行,还有$ FORTRANPPCOM,$ SHFORTRANPPCOM,   $ F77PPCOM和$ SHF77PPCOM命令行用于编译Fortran   源文件和用于组装的$ ASPPCOM命令行   汇编语言源文件,首先运行每个文件   C预处理器。请注意,此变量不包含-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')

您需要对此进行测试以查看SharedObject()和/或SharedLibrary()构建器是否使用这些,我想他们会这样做。

以下评论中的问题解答:

SHCCCOM仅用于查看命令行的外观,有时您可能需要在不使用SCons构建器的情况下直接使用它。 SHCCFLAGSCPPFLAGS和其他人的超集,如果您有标记,只想传递给SharedLibrary()SharedObject(),则应使用CPPFLAGS。 {{1}}适用于静态和共享编译。