为了简单起见,我能够重现这个问题,我有以下例子...
我目前有两个文件,一个SConstruct和一个SConscript。
我的目录树如下:
- .
- SConstruct
- build (dir)
- dir1 (dir)
- mysrc.cpp
- proj (dir)
- SConscript
以下是 SConstruct 的内容:
SConscript('dir1/proj/SConscript', variant_dir='build/out', duplicate=0)
以下是 dir1 / proj / SConscript 的内容:
src = Dir('.').srcnode().abspath + '/../mysrc.cpp'
StaticLibrary('mylib', src)
当我在根目录下运行scons
时,我看到以下输出
g++ -o dir1/mysrc.o -c dir1/mysrc.cpp
ar rc build/out/libmylib.a
ar命令看起来很棒,它输出到variant_dir,即build / out。 这里的问题是mysrc.o的输出位置。它转到dir1而不是build / out。为什么会这样?
答案 0 :(得分:1)
您需要指定源文件的路径,就好像它们位于变体目录路径中一样。
将您的顶级SConstruct
更改为此...
SConscript('dir1/proj/SConscript', variant_dir='build/out', src_dir='dir1', duplicate=0)
将您的dir1/proj/SConscript
更改为此...
src = Dir('.').srcnode().abspath + '/../../build/out/mysrc.cpp'
StaticLibrary('mylib', src)
然后当你跑步时,你会看到以下内容。
>> scons --version
SCons by Steven Knight et al.:
script: v2.3.6.rel_2.3.5:3347:d31d5a4e74b6[MODIFIED], 2015/07/31 14:36:10, by bdbaddog on hpmicrodog
engine: v2.3.6.rel_2.3.5:3347:d31d5a4e74b6[MODIFIED], 2015/07/31 14:36:10, by bdbaddog on hpmicrodog
engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001 - 2015 The SCons Foundation
>> tree
.
├── dir1
│ ├── mysrc.cpp
│ └── proj
│ └── SConscript
└── SConstruct
2 directories, 3 files
>> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o build/out/mysrc.o -c dir1/mysrc.cpp
ar rc build/out/proj/libmylib.a build/out/mysrc.o
ranlib build/out/proj/libmylib.a
scons: done building targets.
>> tree
.
├── build
│ └── out
│ ├── mysrc.o
│ └── proj
│ └── libmylib.a
├── dir1
│ ├── mysrc.cpp
│ └── proj
│ └── SConscript
└── SConstruct
5 directories, 5 files