2016-02-15 192 views
0

我試圖用下列方式使用SCons創建靜態庫鏈接:如何使用SCons鏈接靜態庫?

//LIBSUFFIX and PREFIX are already set 
env.Replace(LINKCOM = '$LINK $LINKOPTFILE $LINKMIXEDOPTIONS $LINKERR $LINKMAPFILE $SOURCES $LINKFILE $_LIBDIRFLAGS $_LIBFLAGS -o $TARGET') 
env.Library('libraryname', ['file1.o','file2.o']) 
env.Program(target = '', LIBS = 'libraryname', LIBPATH = 'path', source = Glob(*.c)) 

我的問題是:libraryname.a:在LINKCOM沒有它的位置前添加庫。也是已經包含在庫中的文件傳遞給鏈接命令(如SCons的不承認我創建從中庫)

恩:我必須從以下來源創建一個程序: main.c s1.c s2.c s3.c和 Library library_s.a from s1.o and s2.o

連接器的命令由SCons的傳遞:

linker.exe linkerflags s1.o s2.o s3.o library_s.a -o target.exe

如何連接在_LIBDIRFLAGS每個目錄及其correspoding庫,以及如何使SCons的意識到,我創造一些源文件庫?

編輯:這是連接器的命令應該怎麼樣子:

'linker.exe' linkerflags s3.o pathtolibrary/library_s.a -o target.exe 

備註:因爲library_s.a從s1.o創建和s2.o我希望SCons的傳遞只有S3的.o和圖書館

+0

如果使用「env.Replace(...)」刪除該行,它會起作用嗎?換句話說,SCons的「智能鏈接方法」應該自動處理所有你想要的東西......爲什麼你必須用其他東西替換它? – dirkbaechle

+0

這是因爲我正在使用另一個編譯器/鏈接器,這是我的工具實現的一部分 –

+0

輸出看起來應該如何?您仍然很難看到您之後的內容,因爲您顯示的命令行與您在SConstruct中所做的定義之間沒有明顯的聯繫......您並未顯示環境的其他設置的外觀喜歡。最後,你使用的是哪一個鏈接器,這是一個商業鏈接嗎? – dirkbaechle

回答

1

你可以簡單地完全需要你的lib的路徑添加到Program()電話:

lib_a = env.Library('libraryname', ['file1.c','file2.c']) 
env.Program('target', ['main.c', 's3.c', 'pathtolibrary/' + str(lib_a[0])]) 

如果您告訴Glob()找到所有C文件(「*.c」),它將返回完整列表。如果這不是您想要的,您必須手動或使用自v2.3.5以來可用的「排除」選項來過濾Glob調用的結果(適用於VariantDirs,只能從v2.4.1中的相應修訂開始! )。

您對於SCons如何運行有關自動檢測lib和目標源文件之間的依賴關係的預期與實際情況不符......不幸的是。通常會做的是重構構建,這樣lib的所有C文件都與主要來源位於不同的子文件夾中。然後,您可以再次使用Glob(*.c),並且不會有干擾源列表。請注意,如何將第二次添加目標文件(如s2.o)再次添加到最終的鏈接步驟可能實際上是有意義的,例如,在循環依賴的情況下...所以SCons(或任何其他構建系統)無論如何都無法自行解決這個問題。總是需要用戶的輸入來解決這些問題。