scons构建静态库和共享库

时间:2013-02-28 16:33:27

标签: scons

我正在尝试使用与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,则相同

我该如何解决这个问题?

1 个答案:

答案 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.