我正在尝试使用与SCons相同的源来构建静态库和共享库。
如果我只构建一个或另一个,一切正常,但是一旦我尝试构建它们,就只构建静态库。
我的SConscript看起来像:
cppflags = SP3_env['CPPFLAGS']
cppflags += ' -fPIC '
SP3_env['CPPFLAGS'] = cppflags
soLibFile = SP3_env.SharedLibrary(
target = "sp3",
source = sources)
installedSoFile = SP3_env.Install(SP3_env['SP3_lib_dir'], soLibFile)
libFile = SP3_env.Library(
target = "sp3",
source = sources)
installedLibFile = SP3_env.Install(SP3_env['SP3_lib_dir'], libFile)
我还在SharedLibrary之前尝试过SharedObject(sources)(从SharedObject返回传递,而不是源代码),但它没有什么不同。如果我在.so。
之前构建.a,则相同我该如何解决这个问题?
答案 0 :(得分:6)
当安装目录不在当前目录中或下方时,SCons的行为不符合预期,如SCons Install method docs:
中所述但请注意,安装文件仍被视为一种类型 file" build。"当您记住默认值时,这很重要 SCons的行为是在当前目录中或之下构建文件。 如果,如上例所示,您正在目录中安装文件 在顶级SConstruct文件的目录树之外,您必须 为它指定该目录(或更高的目录,如/) 在那里安装任何东西:
也就是说,您必须使用安装目录作为目标(在您的情况下为SP3_env['SP3_lib_dir']
)调用SCons,以便执行安装。为简化此操作,请使用env.Alias()
,如下所示。
当您调用SCons时,您至少应该看到静态库和共享库都是在本地项目目录中构建的。但是,我想,SCons不会安装它们。这是我在Ubuntu上运行的一个例子:
env = Environment()
sourceFiles = 'ExampleClass.cc'
sharedLib = env.SharedLibrary(target='example', source=sourceFiles)
staticLib = env.StaticLibrary(target='example', source=sourceFiles)
# Notice that installDir is outside of the local project dir
installDir = '/home/notroot/projects/sandbox'
sharedInstall = env.Install(installDir, sharedLib)
staticInstall = env.Install(installDir, staticLib)
env.Alias('install', installDir)
如果我执行没有目标的scons,我会得到以下内容:
# scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o ExampleClass.o -c ExampleClass.cc
g++ -o ExampleClass.os -c -fPIC ExampleClass.cc
ar rc libexample.a ExampleClass.o
ranlib libexample.a
g++ -o libexample.so -shared ExampleClass.os
scons: done building targets.
然后我可以安装,使用安装目标执行scons,如下所示:
# scons install
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
Install file: "libexample.a" as "/home/notroot/projects/sandbox/libexample.a"
Install file: "libexample.so" as "/home/notroot/projects/sandbox/libexample.so"
scons: done building targets.
或者,您可以使用一个命令完成所有操作,首先清理所有内容
# scons -c install
然后,只需一个命令即可完成所有操作:
# scons install
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o ExampleClass.o -c ExampleClass.cc
g++ -o ExampleClass.os -c -fPIC ExampleClass.cc
ar rc libexample.a ExampleClass.o
ranlib libexample.a
g++ -o libexample.so -shared ExampleClass.os
Install file: "libexample.a" as "/home/notroot/projects/sandbox/libexample.a"
Install file: "libexample.so" as "/home/notroot/projects/sandbox/libexample.so"
scons: done building targets.