2013-02-28 210 views
5

我想建立一個靜態和共享庫與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之前(通過從共享對象的回報,而不是源),但它是沒有什麼不同。如果我在.so之前構建.a,也是如此。

我該如何解決這個問題?

回答

6

當安裝目錄爲或在當前目錄下不,使用SCons並不像預期的那樣,如SCons Install method docs:

注意評論,但是,在安裝文件仍然被認爲是一個類型 文件「build」。當您記住SCons的默認 行爲是在當前目錄中或以下創建文件時,這一點很重要。 如上例所示,如果要在頂級SConstruct文件的目錄樹以外的目錄 中安裝文件,則必須指定 的目錄(或更高的目錄,例如/)爲其安裝任何內容有:

也就是說,您必須調用SCONS並將安裝目錄作爲目標(您的情況爲SP3_env['SP3_lib_dir'])才能執行安裝。爲了簡化這一點,請按照以下方式使用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.