我有一个C ++应用程序,我正在尝试用scons构建,其中包含几个子程序。
每个子程序在源目录的子目录中都有自己的源文件。这些源文件,例如source/prog1/prog1.cpp
被编译成目标文件,这些目标文件位于对象目录中,例如e.e。 object/prog1/prog1.o
。
这很好用,因为每个源目录都有自己的目标目录,并且不会发生冲突。
但是,我要做的是将这些目标文件链接到可执行文件,这些文件可能位于同一个bin
目录中。因此,多个源文件(object/prog1
,object/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"
。
所以,我的问题是:如何将来自多个来源的对象文件链接到同一个变量目录?
答案 0 :(得分: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拒绝将不同的目标构建到一个独特的变体目录中,因为变体旨在构建具有不同构建设置的给定目标,例如调试和发布模式。