gpt4 book ai didi

python - 我们是否需要在每个源目录中都有 sconscript 文件

转载 作者:太空宇宙 更新时间:2023-11-03 12:17:32 27 4
gpt4 key购买 nike

我正在使用 scons 来编译我的项目。在我的项目中,源文件位于不同的目录中。我们是否需要在每个目录中都有 sconscript 文件来编译这些项目源文件?

我试图用单个 sconscript 文件编译所有目录。但是所有目标文件都只添加到我的源目录中。

我正在使用这个功能:

env.Library('libs',files_list)

如果 files_list 包含唯一的文件名,那么 Obj 文件将生成@变体目录。

如果 files_list 包含文件路径名,则 Obj 文件正在生成@source 目录。

你能告诉我怎么做吗?

最佳答案

我准备了一个示例,展示了如何使用 SCons VariantDir() 函数仅使用一个 SConstruct 脚本(没有附属的 SConscripts)来编译像您这样的项目。我决定在一个单独的答案中这样做,这样会更容易阅读。

VariantDir() 函数没有很好的文档记录,因此您提到的有关已编译目标文件放置的行为无法直接修复。 “技巧”是引用变体目录中的所有源文件,而不是实际源目录中的所有源文件,如下所示。

这是我项目中源文件的结构:

$ tree .
.
├── SConstruct
├── src1
│   ├── class1.cc
│   └── class1.h
├── src2
│   ├── class2.cc
│   └── class2.h
└── srcMain
└── main.cc

这是 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])

编译结果如下:

$ 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.

编译后的项目结构如下:

$ 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

应该提到的是,更直接的方法是使用 SConscript() 函数,指定 variant_dir,但如果您的要求不允许您这样做,这个示例也可以。 SCons man page有关于 VariantDir() 函数的更多信息。您还将在其中找到以下内容:

Note that VariantDir() works most naturally with a subsidiary SConscript file.

关于python - 我们是否需要在每个源目录中都有 sconscript 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411176/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com