在SCons环境中同时拥有CCFLAGS和SHCCFLAGS变量的原因是什么?
我正在尝试修改我自己没有编写的大型程序构建。当我添加命令时:
env.Append(CCFLAGS=["-I%s" % amber_dir, "-DAMBER"])
编译器在没有添加标志的情况下运行。但是当我做的时候
env.Append(SHCCFLAGS=["-I%s" % amber_dir, "-DAMBER"])
编译器根据需要添加我的标记。在SCons的内部某处,CCFLAGS没有传递给SHCCFLAGS。但是为什么要开始使用CCFLAGS和SHCCFLAGS?
答案 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个中最有趣的是SHCCCOM
和CPPFLAGS
个变量。再次尝试设置CPPFLAGS
而不是CCFLAGS
。
关于您正在设置的标记的一般注释:使用SCons,通常更好地设置包含CPPPATH
变量的路径,并使用CPPDEFINES
设置定义。使用这些变量时,您不需要包含-I
,也不需要包含-D
标志,SCons将以独立于平台的方式为您添加它。这是一个例子:
env.Append(CPPPATH=amber_dir)
env.Append(CPPDEFINES='AMBER')
您需要对此进行测试以查看SharedObject()和/或SharedLibrary()构建器是否使用这些,我想他们会这样做。
以下评论中的问题解答:
SHCCCOM
仅用于查看命令行的外观,有时您可能需要在不使用SCons构建器的情况下直接使用它。 SHCCFLAGS
是CPPFLAGS
和其他人的超集,如果您有标记,只想传递给SharedLibrary()
或SharedObject()
,则应使用CPPFLAGS
。 {{1}}适用于静态和共享编译。