【问题标题】:scons difference between ccflags and shccflagsccflags 和 shccflags 之间的 scons 区别
【发布时间】:2014-01-26 02:30:38
【问题描述】:

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

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

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

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

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

编译器会根据需要添加我的标志。在 SCons 内部的某个地方,CCFLAGS 没有传递给 SHCCFLAGS。但是为什么要从 CCFLAGS 和 SHCCFLAGS 开始呢?

【问题讨论】:

    标签: scons


    【解决方案1】:

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

    CCFLAGS

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

    CPPFLAGS

    用户指定的 C 预处理器选项。这些将包含在任何 使用 C 预处理器的命令,不仅包括编译 通过 $CCCOM、$SHCCCOM、$CXXCOM 和 $SHCXXCOM 命令行,还有 $FORTRANPPCOM、$SHFORTRANPPCOM、 用于编译 Fortran 的 $F77PPCOM 和 $SHF77PPCOM 命令行 源文件和 $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 适用于静态和共享编译。

    【讨论】:

    • 谢谢,一切都按照您的建议进行。但仍然困惑:什么时候应该使用 CPPFLAGS,什么时候应该使用 SHCCFLAGS,什么时候应该使用 SHCCCOM?这只是个人喜好还是有理由使用其中一个?
    猜你喜欢
    • 2011-05-03
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    • 2015-10-04
    相关资源
    最近更新 更多