2010-02-11 141 views
8

我試圖讓SCons創建一個共享庫。進入.so的項目之一是一個.a靜態庫。SCons與靜態庫(.a)共享庫(.so)

我有這樣一句臺詞:

env_2.SharedLibrary('libstuff.so', \ 
    Split("""stuff.cxx mylib/libMine.a""") 

而且一旦運行它,我得到這個錯誤:

scons: *** Source file: mylib/libMine.a \ 
is static and is not compatible with shared target: libstuff.so 

但是,我知道,共享庫可以從.a通過進行像這樣的命令:

g++ -m32 -shared -o libstuff.so stuff.o mylib/libMine.a 

任何想法讓這個工作或任何解決方法將大大appr eciated。


相關問題:我怎麼scons的把LINK命令行上附加的字符串-sharedProgram()電話嗎?如果我能做到這一點,我認爲它會滿足我的需求。

回答

1

此問題不是特定於scons。要構建共享庫,您需要使用與位置無關的代碼編譯的對象(-fPIC)。您最好的選擇是使用正確的選項編譯源文件中的共享庫。

在SCons中,您可以定義用於構建libMine.a和libShared.so的目標列表。


更新:你的第二個問題,SharedLibrary製造商可能會做你的需要:

SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) 

如果沒有,LINKFLAGS將傳遞給鏈接命令的標誌。

+0

我認爲你是對的。一個具有使用的.o -fPIC沒有取得文件。然而,g ++ -m32共享......仍然以某種方式工作。 – xavjuan 2010-02-11 23:40:34

+1

我回去了,並且使用-fPIC編譯了.a文件,但這似乎沒有幫助。 – xavjuan 2010-02-12 02:08:22

+0

LINKFLAGS很有幫助。謝謝。 – xavjuan 2010-02-16 16:08:29

0
env_2.SharedLibrary('libstuff.so', Split("""stuff.cxx"""), LIBS='libMine.a', LIBPATH='mylib') 

這應該有效。

+0

這工作,但不創建依賴於'libMine.a' – shoosh 2012-11-20 09:10:15

+0

@shoosh是的,它的作用。 'SharedLibrary'構建器使用'ProgramScanner'來搜索通過'LIBS'指定的依賴關係。 – 2015-06-19 22:18:04

0

我在cygwin下有同樣的問題。我通過「-fPIC」選項構建對象時,gcc和得到以下警告:

warning: -fPIC ignored for target (all code is position independent)

我也通過「-shared」的鏈接命令。我終於得到了錯誤

"***.lib is static and is not compatible with shared target: myso.dll"

看來scons的不允許這樣直接從OBJ或LIB文件創建,以及一個可以從(使用SharedLibrary())或源文件的列表創建這樣源文件+'LIBS'選項,如dummytaurus說。我對此很好奇。

10

嘗試在您的SConstruct中設置env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME']=1

+0

這是使它工作的魔法巫術。 – shoosh 2012-11-20 09:12:00

+1

這個'巫術巫術'也適用於我。我很驚訝,因爲在添加到SConstruct之後,在編譯命令選項中沒有看到任何區別。我希望那個提出這個魔法的巫醫解釋它給我們凡人。 – 2013-02-17 20:14:28

+1

SharedLibrary構建器會檢查是否所有給定的對象文件都是使用SharedObject構建器構建的(因此使用-fPIC)。 env ['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1禁用此檢查。你需要自己決定這是否是一個好主意... – ElektroKraut 2014-04-22 14:20:36

1

問題出在函數SharedFlagChecker(Default.py)中,該函數僅檢查內部「共享」標誌。 SCons文檔引導您相信它通過後綴(SHOBJSUFFIX)保留了共享對象和靜態對象之間的區別,但並非如此。修復很簡單。在文件scons-local.../SCons/Default.py找到SharedFlagChecker和編輯:

def SharedFlagChecker(source, target, env): 
    same = env.subst('$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME') 
    if same == '0' or same == '' or same == 'False': 
     for src in source: 
      try: 
       shared = src.attributes.shared 
      except AttributeError: 
       # Replace this line: shared = None 
       shared = env.Dictionary()['SHOBJSUFFIX'] == src.suffix 
      if not shared: 
       raise SCons.Errors.UserError("Source file: ...") 

對象現在通過SharedObject建設者提出將在共享庫可鏈接。

+0

你應該使用env ['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = True,而不是破解代碼來禁用它。它在手冊頁中。 – bdbaddog 2015-06-20 01:34:18