如何解决“scons:警告:为目标指定了两个不同的环境”

2024-01-24

假设我有一个SConstruct文件看起来像这样:

env = Environment()

env.Program("a", ["a.c", "util.c"])
env.Program("b", ["b.c", "util.c"])

此构建工作正常,没有 SCons 警告消息。但是,如果我修改它来指定不同的每个库Program构建(实际的库不相关):

env.Program("a", ["a.c", "util.c"], LIBS="m")
env.Program("b", ["b.c", "util.c"], LIBS="c")

然后我收到警告:



scons: warning: Two different environments were specified for target util.o,
        but they appear to have the same action: $CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES
  

这似乎是由Program构建器自动创建一个新的环境来构建sources,尽管这只是LIBS不同的变量(因此只有link步骤需要有不同的环境)。我可以通过执行以下操作来解决此问题:

util = env.Object("util.c")
env.Program("a", ["a.c"] + util, LIBS="m")
env.Program("b", ["b.c"] + util, LIBS="c")

这使用单个Object建筑建造者util.c,然后在每个中使用预编译的目标文件Program构建,从而避免警告。然而,这并不是真正必要的。有没有更优雅的方法来解决这个问题?或者这实际上是 SCons 中应该修复的错误?

上下文:我有近 2000 个 C 源文件编译成大约 20 个库和 120 个可执行文件,其中包含大量共享源。我创建了SConstruct使用我编写的转换脚本从以前的专有构建系统中获取文件。 SCons 为使用我当前的完整构建生成了大约 450 条“两种不同环境”警告消息SConstruct.


我找到了一种解决方法,不涉及创建额外的变量来保存对象文件节点:

env.Program("a", ["a.c", env.Object("util.c")], LIBS="m")
env.Program("b", ["b.c", env.Object("util.c")], LIBS="c")

这隔离了构建util.c在单一环境内。虽然指定了两次,但各一次Program, SCons 不会对此发出警告,因为它是使用相同的源构建的env目的。当然,在这种情况下 SCons 只编译一次源代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决“scons:警告:为目标指定了两个不同的环境” 的相关文章

  • 如何在 scons 中每次构建后运行一些代码?

    我正在寻找一种方法来注册诸如 scons 中的最终构建回调之类的东西 例如 我现在正在做这样的事情 def print build summary failures SCons Script GetBuildFailures notifyE
  • SCons 在 Windows 中启动超慢

    长期以来 我在使用 SCons 进行构建时一直饱受启动时间过长的困扰 在我的旧工作笔记本电脑上 构建最基本的 hello world 示例可能需要长达 60 秒的时间 我刚刚收到一台新笔记本电脑 所以我有机会进一步调查这一点 我们的笔记本电
  • COBOL 的 Scons

    我想在 scons 中创建一个与 COBOL 一起使用的构建器 这是一个开始 import re Import env Source src cpy COPYBK1 cpy src cpy COPYBK2 cpy src cpy COPYB
  • 如何为使用 SCons 构建的程序内置 gprof 支持?

    问候 这是我的 SConstruct 文件 env Environment env Append CCFLAGS g pg env Program target program1 source program1 c 这也是编译的输出 sco
  • 使用 SCons 进行真正的分层构建?

    所以我读过这里有关分层构建的问题 例如 使用 SCons 创建分层构建 https stackoverflow com questions 3709321 creating a hierarchical build with scons 我
  • SCons:获取原始文件的绝对路径(就好像我没有设置variant_dir一样)

    我可以用File foo bar abspath获取文件的位置 但如果我设置了variant dir 则返回的路径将位于variant dir而不是原始位置 如果我有duplicate 0设置 那么返回的文件实际上并不存在 显然 SCons
  • 为什么 clang 在 Scons 下不显示颜色输出?

    使用 Scons 构建时 我可以将其配置为使用 clang 如下所示 env CXX clang 但是 它似乎没有保留 clang 输出的颜色信息 我怎样才能让 scons 保留颜色 根据铿锵文档 http clang llvm org d
  • SCons 无法选择编译器(MinGW)[重复]

    这个问题在这里已经有答案了 我有一个简单的 SConstruct 文件 其中包含以下代码 path C MinGW bin env Environment ENV PATH path Program target myprogram sou
  • 如何将 scons 指向安装在我的主目录中的不同编译器?

    我尝试编辑 SConstruct 以指向不同的 gcc 编译器 但它似乎总是使用 usr bin gcc 和 usr bin g 中定义的编译器 env DefaultEnvironment env CC home aaron devel
  • 如何让 SCons 替换已安装文本文件中的文本

    我希望能够在从 scons 安装一些 python 脚本时替换模板变量 SOFTWARE VERSION scons已经有这样的功能了吗 如果没有 那么挂钩 scons 安装过程的最佳方法是什么 以便我可以在安装过程中执行此操作 你可以使用
  • SCONS 运行目标

    我一直在寻找 寻找 但找不到我的问题的答案 我今晚刚刚开始学习 scons 看起来棒极了 不过我遇到了一点困惑 为了便于开发 我经常喜欢让我的 make 文件构建我的目标 然后运行它 以便我可以通过一次按键来测试更改 这在 make 文件中
  • 如何将交叉编译器与 Scons 一起使用?

    遵循建议关于斯康斯常见问题解答 http www scons org wiki FrequentlyAskedQuestions Why doesn 27t SCons find my compiler 2BAC8 linker 2BAC8
  • scons 知道 SConscript 文件位于哪个目录吗?

    我们正在评估 scons 作为构建系统 但我在适应我们的旧系统时遇到了问题 在我们的一些源代码子目录中 我们有一个 sources lib 文件 其中列出了需要编译以组装该目录的目标库的 C 文件的名称 但是 同一目录中还有其他 C 文件
  • SCons 问题 - 不理解 Variables 类

    我正在为一个项目开发 SConstruct 构建文件 并且尝试从选项更新为变量 因为选项已被弃用 我不明白如何使用变量 我有 0 python 经验 这可能是造成这一点的原因 例如 我有这个 opts Variables opts Add
  • 告诉 SCons 不要自动创建目录?

    我正在尝试让 SCons 查看我需要的 git 存储库 并希望使该存储库保持最新 问题是我必须告诉它 git 存储库包含哪些文件才能在构建中使用它们 如果我这样做 SCons 将在尝试克隆存储库之前创建存储库 例如 假设我想克隆 GStre
  • 如何在 scons 中添加 --whole-archive 链接器选项?

    我有一个仅在静态范围内与应用程序交互的库 这需要我将库与 whole archive选项以避免链接器 优化 库 这样做是因为链接器实际上从未看到我的库正在被使用 问题是我还没有找到为 scons 中的特定库添加此链接器选项的方法 env A
  • ant+cpptasks 与 scons 与 make

    我正在调查scons http www scons org 我只是想确保在我将大量脑细胞投入到完全不同的事物之前我知道替代方案是什么 我过去一直在使用 GNU make 但从来没有对它感到特别满意 特别是 为什么 Ant 没有更频繁地用于
  • Scons:仅当目标发生更改时才生成版本文件

    我需要从 SCons 脚本生成 version cc 文件 仅当目标的任何源文件发生更改时才应生成此文件 假设 SCons 脚本有以下语句 python function which generates version cc in the
  • 如何在没有自定义代码的情况下从命令行通过 Scons 传递任意编译器 CFLAGS?

    有没有办法写这样的东西 scons CFLAGS fsanitize address fsanitize thread 这只适用于最小的脚本 env Environment env Program target main out sourc
  • 如何使用 Visual Studio 命令行 + SCons 构建 Windows XP 应用程序?

    使用 Visual Studio 2015 IDE 构建 Windows XP 应用程序一点也不难 您只需要使用正确的平台工具集 v120 xp 或 v140 xp 并确保在目标计算机上安装正确的可再发行 Visual Studio 运行时

随机推荐