我正在使用scons来编译我的项目.在我的项目中,源文件位于不同的目录中.我们是否需要在每个目录中使用sconscript文件来编译这些项目源文件?
我试图使用单个sconscript文件编译所有目录.但是所有目标文件都只添加到我的源目录中.
我正在使用这个功能:
env.Library('libs',files_list)
Run Code Online (Sandbox Code Playgroud)
如果files_list包含唯一的文件名,则Obj文件正在生成@variable目录.
如果files_list包含文件路径名,则Obj文件正在生成@ source目录.
你能告诉我怎么做吗?
Bra*_*ady 14
我准备了一个示例,演示了如何使用SCons VariantDir()函数只使用一个SConstruct脚本(没有子SConscripts)来编译像您这样的项目.我决定在单独的答案中这样做,以便更容易阅读.
VariantDir()函数没有很好地记录,因此您提到的有关编译对象文件放置的行为不是直接修复的."技巧"是指变体目录中的所有源文件,而不是实际的源目录,如下所示.
这是我项目中源文件的结构:
$ tree .
.
??? SConstruct
??? src1
? ??? class1.cc
? ??? class1.h
??? src2
? ??? class2.cc
? ??? class2.h
??? srcMain
??? main.cc
Run Code Online (Sandbox Code Playgroud)
这是SConstruct:
env = Environment()
# Set the include paths
env.Append(CPPPATH = ['src1', 'src2'])
# Notice the source files are referred to in the build dir
# If you dont do this, the compiled objects will be in the src dirs
src1Sources = ['build/lib1/class1.cc']
src2Sources = ['build/lib2/class2.cc']
mainSources = ['build/mainApp/main.cc']
env.VariantDir(variant_dir = 'build/lib1', src_dir = 'src1', duplicate = 0)
env.VariantDir(variant_dir = 'build/lib2', src_dir = 'src2', duplicate = 0)
env.VariantDir(variant_dir = 'build/mainApp', src_dir = 'srcMain', duplicate = 0)
lib1 = env.Library(target = 'build/lib1/src1', source = src1Sources)
lib2 = env.Library(target = 'build/lib1/src2', source = src2Sources)
env.Program(target = 'build/mainApp/main', source = [mainSources, lib1, lib2])
Run Code Online (Sandbox Code Playgroud)
这是编译输出:
$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o build/lib1/class1.o -c -Isrc1 -Isrc2 src1/class1.cc
ar rc build/lib1/libsrc1.a build/lib1/class1.o
ranlib build/lib1/libsrc1.a
g++ -o build/lib2/class2.o -c -Isrc1 -Isrc2 src2/class2.cc
ar rc build/lib1/libsrc2.a build/lib2/class2.o
ranlib build/lib1/libsrc2.a
g++ -o build/mainApp/main.o -c -Isrc1 -Isrc2 srcMain/main.cc
g++ -o build/mainApp/main build/mainApp/main.o build/lib1/libsrc1.a build/lib1/libsrc2.a
scons: done building targets.
Run Code Online (Sandbox Code Playgroud)
以下是编译后生成的项目结构:
$ tree .
.
??? build
? ??? lib1
? ? ??? class1.o
? ? ??? libsrc1.a
? ? ??? libsrc2.a
? ??? lib2
? ? ??? class2.o
? ??? mainApp
? ??? main
? ??? main.o
??? SConstruct
??? src1
? ??? class1.cc
? ??? class1.h
??? src2
? ??? class2.cc
? ??? class2.h
??? srcMain
??? main.cc
Run Code Online (Sandbox Code Playgroud)
应该提到的是,更直接的方法是使用SConscript()函数,指定variant_dir,但如果您的要求不允许这样做,则此示例将起作用.该SCons的手册页有关于VariantDir()函数的更多信息.在那里你还会发现以下内容:
请注意,VariantDir()最自然地使用辅助SConscript文件.
| 归档时间: |
|
| 查看次数: |
5226 次 |
| 最近记录: |