这是我的简单案例。我有一个源文件结构如下:
.
├── SConstruct
└── src
├── SConscript
├── staticLib
│ ├── classInStaticLib.cpp
│ ├── classInStaticLib.h
│ └── SConscript
└── test.cpp
SConstruct:
VariantDir('build', 'src', duplicate=0)
SConscript('build/SConscript')
的src / SConscript:
import os
lib = 'staticLib'
SConscript(os.path.join(lib, 'SConscript'))
Program( 'test',
'test.cpp',
CPPPATH = lib,
LIBS = lib,
LIBPATH = lib )
的src / staticLib / SConscript:
Library('staticLib', 'classInStaticLib.cpp')
在我运行scons之后,我得到了以下内容:
g++ -o build/staticLib/classInStaticLib.o -c src/staticLib/classInStaticLib.cpp
ar rc build/staticLib/libstaticLib.a build/staticLib/classInStaticLib.o
ranlib build/staticLib/libstaticLib.a
g++ -o build/test.o -c -Ibuild/staticLib -Isrc/staticLib src/test.cpp
g++ -o build/test build/test.o -Lbuild/staticLib -Lsrc/staticLib -lstaticLib
完成没有错误的scons完成。但请注意第4行中有“-Ibuild / staticLib”和“-Isrc / staticLib”,第5行中有“-Lbuild / staticLib”和“-Lsrc / staticLib”。应该只有一个。
为什么会这样?
答案 0 :(得分:1)
我认为这种情况正在发生,因为您正在使用SCons VariantDir()
函数,这会导致SCons查看构建目录。我从未见过它同时使用source和variant_dir目录。
VariantDir()
函数通常仅在您未使用SConscript()
函数时使用。尝试将SConscript()
中的SConstruct
来电更改为使用variant_dir
参数并移除对VariantDir()
的呼叫,如下所示:
SConscript('src/SConscript', variant_dir='build', duplicate=0)
我还会考虑更改src/SConscript
,如下所示:
import os
lib = 'staticLib'
SConscript(os.path.join(lib, 'SConscript'),
variant_dir=os.path.join(lib, 'build'),
duplicate=0)
Program( 'test',
'test.cpp',
CPPPATH = lib,
LIBS = lib,
LIBPATH = lib )
这是执行scons时得到的结果,BTW与你的相同:
$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o build/staticLib/classInStaticLib.o -c src/staticLib/classInStaticLib.cpp
ar rc build/staticLib/libstaticLib.a build/staticLib/classInStaticLib.o
ranlib build/staticLib/libstaticLib.a
g++ -o build/test.o -c -Ibuild/staticLib -Isrc/staticLib src/test.cpp
g++ -o build/test build/test.o -Lbuild/staticLib -Lsrc/staticLib -lstaticLib
scons: done building targets.
$ tree build/
build/
|-- staticLib
| |-- classInStaticLib.o
| `-- libstaticLib.a
|-- test
`-- test.o
1 directory, 4 files
我从未注意到SCons这样做,并且无法解释为什么会这样做。我尝试使用不同的variant_dir选项,并始终得到相同的。我会说你做错了什么,而且这是一种特殊的SCons行为。
答案 1 :(得分:1)
这是正常的,有意的"根据我在SCons-users邮件列表中得到的响应使用VariantDir()的效果。
请参阅four.pairlist.net/pipermail/scons-users/2014-April/002440.html
Pawel说:"你可能有源文件/标题生成(例如SWIG或SConf),他们转到变量目录,其他的直接来自源目录,所以-Ibuild / staticLib -Isrc /我认为staticLib是正确的。"
答案 2 :(得分:0)
这是我使用的一种解决方法:
import os
def abs_path(rel_path):
return os.path.join(Dir('.').srcnode().abspath, rel_path)
lib = 'staticLib'
SConscript(os.path.join(lib, 'SConscript'))
Program( 'test',
'test.cpp',
CPPPATH = abs_path(lib),
LIBS = lib,
LIBPATH = lib )
答案 3 :(得分:-1)
我创建了这个目录结构:
stest.cpp
Sconstruct
dira/hello.cpp
dira/hello.h
dirb/hello.cpp
dirb/hello.h
我的Sconstruct包含这个:
SOURCES = [ 'stest.cpp', 'hello.cpp' ]
common = Environment ()
a=common.Clone (CPPPATH='#')
a.Repository ('#/dira')
a.Object ('obja/stest.o', 'stest.cpp')
a.Object ('obja/hello.o', 'dira/hello.cpp')
a.Program ('obja/a', ['obja/stest.o', 'obja/hello.o'])
a.Alias ('a', 'obja/a')
b=common.Clone (CPPPATH='#')
b.Repository ('#/dirb')
b.Object ('objb/stest.o', 'stest.cpp')
b.Object ('objb/hello.o', 'dirb/hello.cpp')
b.Program ('objb/b', ['objb/stest.o', 'objb/hello.o'])
b.Alias ('b', 'objb/b')
运行scons -n a b
即可:
g++ -o obja/stest.o -c -I. -Idira -Idirb obja/stest.cpp
g++ -o obja/hello.o -c -I. -Idira -Idirb obja/hello.cpp
g++ -o obja/a obja/stest.o obja/hello.o
g++ -o objb/stest.o -c -I. -Idira -Idirb objb/stest.cpp
g++ -o objb/hello.o -c -I. -Idira -Idirb objb/hello.cpp
g++ -o objb/b objb/stest.o objb/hello.o
所以,这显然与VariantDir()
无关。