将多个源目录构建到同一个目标目录中

3
我有一个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",错误就会消失。
所以,我的问题是:如何将来自多个源的对象文件链接到同一个变体目录中?

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

2
在您的情况下,我会让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拒绝将不同的目标构建到一个唯一的变体目录中,因为变体是为了使用不同的构建设置(例如调试和发布模式)构建给定的目标而设计的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接