SCons 第四章 編譯鏈接庫(kù)文件

第四章 編譯鏈接庫(kù)文件

? 大型軟件工程一般都是由很多庫(kù)文件構(gòu)成柒爸,采用SCons編譯庫(kù)文件是一件非常簡(jiǎn)單的事情。

4.1 編譯庫(kù)文件

? 您只需要采用Library的構(gòu)建方法代替Program即可:

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

? SCons會(huì)自動(dòng)根據(jù)系統(tǒng)來(lái)創(chuàng)建合適的庫(kù)文件前綴和后綴晕翠,因此在POSIX或者Linux系統(tǒng)上嘹朗,上述示例將會(huì)構(gòu)建以下內(nèi)容(ranlib可能在某系系統(tǒng)中不會(huì)被調(diào)用):

> scons -Q
cc -o f1.o -c f1.c
cc -o f2.o -c f2.c
cc -o f3.o -c f3.c
ar rc libfoo.a f1.o f2.o f3.o
ranlib libfoo.a

? 在Windows系統(tǒng)中皱炉,編譯輸出將會(huì)如下所示:

C:\>scons -Q
cl /Fof1.obj /c f1.c /nologo
cl /Fof2.obj /c f2.c /nologo
cl /Fof3.obj /c f3.c /nologo
lib /nologo /OUT:foo.lib f1.obj f2.obj f3.obj

? 目標(biāo)文件的構(gòu)建規(guī)則和Program方法類似呢撞,如果你不特別指定目標(biāo)庫(kù)文件名稱,SCons將會(huì)從源文件列表中選擇第一個(gè)作為庫(kù)文件名稱条获,同時(shí)SCons還會(huì)自動(dòng)給庫(kù)文件加入前綴和后綴忠荞。

4.1.1 通過(guò)源文件或中間文件編譯

? 上述示例介紹了通過(guò)源文件列表構(gòu)建庫(kù)文件,SCons同樣也支持通過(guò)中間文件構(gòu)建帅掘,或者源文件和中間文件混在一起構(gòu)建也可以委煤。

Library('foo', ['f1.c', 'f2.o', 'f3.c', 'f4.o'])

? 同時(shí)SCons也會(huì)意識(shí)到,只有源文件才需要進(jìn)一步構(gòu)建成中間文件:

> scons -Q
cc -o f1.o -c f1.c
cc -o f3.o -c f3.c
ar rc libfoo.a f1.o f2.o f3.o f4.o
ranlib libfoo.a

? 當(dāng)然修档,無(wú)論源文件還是中間文件碧绞,要想構(gòu)建成功,它們都必須真實(shí)存在吱窝。下一章節(jié)將會(huì)進(jìn)一步介紹關(guān)于Node Objects的相關(guān)內(nèi)容讥邻。

4.1.2 構(gòu)建靜態(tài)庫(kù)文件:StaticLibrary方法

? Library構(gòu)建方法構(gòu)建的是傳統(tǒng)靜態(tài)庫(kù),如果您想特別聲明構(gòu)建的是靜態(tài)庫(kù)文件院峡,則可以通過(guò)調(diào)用StaticLibrary來(lái)進(jìn)一步顯示聲明:

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

? 對(duì)于LibraryStaticLibrary兴使,他們完全等價(jià),沒(méi)有任何區(qū)別照激。

4.1.3 構(gòu)建動(dòng)態(tài)庫(kù)文件(DLL):SharedLibrary方法

? 如果您想構(gòu)建動(dòng)態(tài)庫(kù)文件(POSIX系統(tǒng)发魄, WINDOWS系統(tǒng)是DLL文件),您可以采用SharedLibrary方法:

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

? 在POSIX系統(tǒng)上的輸出為:

> scons -Q
cc -o f1.os -c f1.c
cc -o f2.os -c f2.c
cc -o f3.os -c f3.c
cc -o libfoo.so -shared f1.os f2.os f3.os

? 在Windows系統(tǒng)上輸出為:

C:\>scons -Q
cl /Fof1.obj /c f1.c /nologo
cl /Fof2.obj /c f2.c /nologo
cl /Fof3.obj /c f3.c /nologo
link /nologo /dll /out:foo.dll /implib:foo.lib f1.obj f2.obj f3.obj
RegServerFunc(target, source, env)
embedManifestDllCheck(target, source, env)

? SCons在構(gòu)建時(shí)俩垃,會(huì)自動(dòng)添加-shared(POSIX)或者/dll(Windows系統(tǒng))編譯選項(xiàng)励幼,以保證編譯的正確性。

4.2 鏈接庫(kù)文件

? 鏈接是庫(kù)文件使用的最后一步口柳,您可以通過(guò)指明LIBS變量關(guān)鍵字苹粟,來(lái)指定需要鏈接的庫(kù)文件;通過(guò)指明LIBPATH變量關(guān)鍵字跃闹,來(lái)指定庫(kù)文件的查找路徑:

Library('foo', ['f1.c', 'f2.c', 'f3.c'])
Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.')

? 請(qǐng)注意嵌削,您不需要特別聲明庫(kù)文件的前綴(如lib),或者后綴(如.a或.lib)辣卒,SCons會(huì)自動(dòng)根據(jù)系統(tǒng)來(lái)查找相關(guān)前綴或后綴掷贾。

? 在POSIX或Linux系統(tǒng)中睛榄,上述編譯過(guò)程如下:

> scons -Q
cc -o f1.o -c f1.c
cc -o f2.o -c f2.c
cc -o f3.o -c f3.c
ar rc libfoo.a f1.o f2.o f3.o
ranlib libfoo.a
cc -o prog.o -c prog.c
cc -o prog prog.o -L. -lfoo -lbar

? 在Windows系統(tǒng)中荣茫,編譯輸出如下:

C:\>scons -Q
cl /Fof1.obj /c f1.c /nologo
cl /Fof2.obj /c f2.c /nologo
cl /Fof3.obj /c f3.c /nologo
lib /nologo /OUT:foo.lib f1.obj f2.obj f3.obj
cl /Foprog.obj /c prog.c /nologo
link /nologo /OUT:prog.exe /LIBPATH:. foo.lib bar.lib prog.obj
embedManifestExeCheck(target, source, env)

? 另外,如果依賴的庫(kù)文件只有一個(gè)场靴,您也可以直接指定LIBS變量啡莉,而不是列表形式:

Program('prog.c', LIBS='foo', LIBPATH='.')
Program('prog.c', LIBS=['foo'], LIBPATH='.')

? 上述兩種寫(xiě)法完全等價(jià)港准。

4.3 查找?guī)煳募篖IBPATH變量

? 默認(rèn)情況下,連接器只會(huì)在系統(tǒng)路徑中查找?guī)煳募中溃琒Cons可以通過(guò)用戶指定的LIBPATH變量浅缸,來(lái)查找用戶定義路徑:

Program('prog.c', LIBS = 'm',
                  LIBPATH = ['/usr/lib', 'usr/local/lib'])

? 這里推薦使用python的列表(list),因?yàn)閜ython是跨平臺(tái)的魄咕,這要遷移起來(lái)比較方便衩椒。當(dāng)然您也可以將搜索路徑放到一個(gè)字符串中,采用系統(tǒng)指定的分割符分開(kāi)哮兰,如POSIX系統(tǒng)中采用冒號(hào)毛萌,Windows系統(tǒng)中采用分號(hào):

# POSIX
LIBPATH = '/usr/lib:/usr/local/lib'
# Windows
LIBPATH = 'C:\\lib;D:\\lib'  

? 請(qǐng)注意,python在Windows路徑中要求采用反斜杠轉(zhuǎn)義符喝滞。

? 當(dāng)鏈接器執(zhí)行時(shí)阁将,SCons會(huì)自動(dòng)創(chuàng)建合適的標(biāo)志,以便在和工程文件相同目錄下查找右遭,在POSIX或Linux系統(tǒng)中做盅,上述示例編譯輸出如下:

> scons -Q
cc -o prog.o -c prog.c
cc -o prog prog.o -L/usr/lib -L/usr/local/lib -lm

? 在Windows系統(tǒng)中,輸出如下:

C:\>scons -Q
cl /Foprog.obj /c prog.c /nologo
link /nologo /OUT:prog.exe /LIBPATH:\usr\lib /LIBPATH:\usr\local\lib m.lib prog.obj
embedManifestExeCheck(target, source, env)

? 整體而言窘哈,SCons會(huì)自動(dòng)根據(jù)系統(tǒng)不同吹榴,而創(chuàng)建不同的編譯選項(xiàng),以保證編譯輸出的正確性滚婉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腊尚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子满哪,更是在濱河造成了極大的恐慌婿斥,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哨鸭,死亡現(xiàn)場(chǎng)離奇詭異民宿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)像鸡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門活鹰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人只估,你說(shuō)我怎么就攤上這事志群。” “怎么了蛔钙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵锌云,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吁脱,道長(zhǎng)桑涎,這世上最難降的妖魔是什么彬向? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮攻冷,結(jié)果婚禮上娃胆,老公的妹妹穿的比我還像新娘。我一直安慰自己等曼,他們只是感情好里烦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著禁谦,像睡著了一般招驴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枷畏,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天别厘,我揣著相機(jī)與錄音,去河邊找鬼拥诡。 笑死触趴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渴肉。 我是一名探鬼主播冗懦,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼仇祭!你這毒婦竟也來(lái)了披蕉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乌奇,失蹤者是張志新(化名)和其女友劉穎没讲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體礁苗,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爬凑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了试伙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘁信。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疏叨,靈堂內(nèi)的尸體忽然破棺而出潘靖,到底是詐尸還是另有隱情,我是刑警寧澤蚤蔓,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布卦溢,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏既绕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一涮坐、第九天 我趴在偏房一處隱蔽的房頂上張望凄贩。 院中可真熱鬧,春花似錦袱讹、人聲如沸疲扎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)椒丧。三九已至,卻和暖如春救巷,著一層夾襖步出監(jiān)牢的瞬間壶熏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工浦译, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棒假,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓精盅,卻偏偏與公主長(zhǎng)得像帽哑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叹俏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容