【问题标题】:Build multiple source directories into the same target directory将多个源目录构建到同一个目标目录中
【发布时间】:2013-11-02 10:51:37
【问题描述】:

我有一个 C++ 应用程序,我正在尝试使用 scons 构建它,它由几个子程序组成。

每个子程序在源目录的子目录中都有自己的源文件。这些源文件,例如source/prog1/prog1.cpp,被编译成驻留在对象目录中的对象文件,例如object/prog1/prog1.o.

这很好,因为每个源目录都有其目标目录,并且没有冲突的可能性。

但是,我正在尝试将这些目标文件链接到可执行文件中,这些可执行文件将位于同一 bin 目录中。所以多个源文件(object/prog1object/prog2 等)都会进入同一个目标目录(bin)。

目录布局如下:

application
    source
        prog1
            prog1.cpp
            something.cpp
        prog2
            prog2.cpp
            somethingelse.cpp
    object
        prog1
            prog1.o
            something.o
        prog2
            prog2.o
            somethingelse.o
    bin
        ??? <- what I'm concerned with

我正在尝试使用以下 SConstruct 脚本来实现:

env = Environment()
Export('env')

#common objects
common=env.SConscript("source/common/SConscript_object", variant_dir="object/common", duplicate=0)
Export('common')

#sub-programs
env.SConscript("source/prog1/SConscript_bin", variant_dir="bin", duplicate=0)
env.SConscript("source/prog2/SConscript_bin", variant_dir="bin", duplicate=0)

但是,scons 抱怨以下错误:

scons: *** 'bin' already has a source directory: 'source/prog1'.

如果我让每个子程序在 bin 目录中都有自己的目录,错误就会消失,例如variant_dir="bin/prog1".

所以,我的问题是:如何将多个来源的目标文件链接到同一个变体目录?

【问题讨论】:

  • 我能够重现这种行为。我尝试将对 VariantDir() 的调用与 SConscript() 结合起来,并遇到了同样的问题。我无法解释它,但似乎 SCons 不喜欢多个源目录来获取唯一的 variant_dir。您可以尝试在 SCons 用户的组邮件列表中询问:Scons-users@scons.org

标签: c++ build linker scons directory-structure


【解决方案1】:

在你的情况下,我会让 SCons 在它们各自的文件夹中构建不同的二进制文件,然后使用 Install builder 将二进制文件复制到 bin/ 目录。

你会得到类似的东西:

env = Environment()
Export('env')

common = env.SConscript("source/common/SConscript_object", variant_dir="object/common", duplicate=0)
Export('common')

prog1 = env.SConscript("source/prog1/SConscript_bin", variant_dir="object/prog1", duplicate=0)
prog2 = env.SConscript("source/prog2/SConscript_bin", variant_dir="object/prog2", duplicate=0)

env.Install('bin', prog1)
env.Install('bin', prog2)

子程序的 SConscript 类似于

Import('env')
Import('common')

prog1 = env.Program('prog1', [ env.Glob(*.cpp), common ])

Return('prog1')

我认为 SCons 拒绝将不同的目标构建到唯一的变体目录中,因为变体旨在构建具有不同构建设置的给定目标,例如调试和发布模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多