【问题标题】:Can SCons keep track of linking dependencies?SCons 可以跟踪链接依赖项吗?
【发布时间】:2013-09-01 14:08:02
【问题描述】:

我目前正在开发一个 C 项目,其中包含一个主要可执行文件和一个用于每个单元测试的可执行文件。在 SConstruct 文件中,我指定每个可执行文件的依赖项,例如

env.Program(['Main.c', 'Foo.c', 'Bar.c', 'Baz.c', ...])
env.Program(['FooTest.c', 'Foo.c', 'Baz.c', ...])
env.Program(['BarTest.c', 'Bar.c', 'Baz.c', ...])
...

然而,这很容易出错且不优雅,因为构建工具也可以跟踪依赖关系,在本例中为 SCons。如何改进我的构建脚本?

【问题讨论】:

  • 这个和这个问题基本一样:stackoverflow.com/q/18141648/1158895
  • 您可以通过使用库来改进这一点。
  • @Brady 那么问题是为什么在 SCons(或我知道的任何其他构建工具)中没有实现链接依赖的自动跟踪。
  • 构建工具不应该在如此低的级别上工作来读取源文件并找出包含的依赖关系。
  • @lzprgmr 但这就是 Scons 所做的,不管你喜不喜欢。它不做的是整理链接依赖。

标签: c build scons


【解决方案1】:

您要的是某种工具 1)查看您包含的标题 2) 从头文件中确定需要构建的源文件 3)冲洗并重复您刚刚添加的所有源文件

一旦完成,它就必须查看它生成的树,并尝试将其中的一些压缩到合理的库中,假设你还没有这样做(并且看看这两个问题的语气,那练习似乎被视为学术性的,而不是良好软件开发的标准部分)。

可能有一些工具说“您已包含标头 A/Bh,因此您的链接行中需要 libA”,但即使这样也会有很多陷阱,具体取决于不同的人如何构建并链接他们的库。

但是您问的是如何定义编写构建脚本的构建脚本。这是你应该为自己做的事情。

【讨论】:

  • 我主要关心对象文件,而不是库。考虑到 SCons 已经使用的依赖关系树,确定哪些目标文件需要链接在一起应该几乎是微不足道的。
  • 仅在您保证每个源代码文件只有一个头文件的情况下(通常不是非常好的做法,因为每个函数应该有一个源文件)并且您没有库。这种情况并不常见
  • 只要一个模块只有一个实现,我只使用一个 .c 文件(与头文件具有相同的基本名称)。据我所知,这是惯例。然后 SCons 可以自动链接到每个目标文件 foo 对应于 foo.h/foo.c 如果目标依赖于这些。仍然需要手动指定库。
  • 但我明白你的意思;如果有多个实现文件对应于头文件,则构建工具无法知道要链接其中的哪一个。
  • 这是一个“惯例”,老实说,这是一个非常糟糕的惯例。还有一个约定,每个源代码文件都有 一个 函数。这使得可执行文件更加精简,并消除了大量讨厌的链接时间依赖性。构建系统要解决这个问题将非常乏味。
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
相关资源
最近更新 更多