国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 操作系統(tǒng) > 正文

scons使用

2024-06-28 14:32:30
字體:
供稿:網(wǎng)友

1.概述

    scons是一個(gè)Python寫的自動(dòng)化構(gòu)建工具,和GNU make相比優(yōu)點(diǎn)明顯:
    A.移植性:python能運(yùn)行的地方,就能運(yùn)行scons
    B. 擴(kuò)展性:理論上scons只是提供了python的類,scons使用者可以在這個(gè)類的基礎(chǔ)上做所有python能做的事情。比如想把一個(gè)已經(jīng)使用了Makefile大型工程切換到scons,就可以保留原來的Makefile,并用python解析Makefile中的編譯選項(xiàng)、源/目標(biāo)文件等,作為參數(shù)傳遞給scons,完成編譯。
    C. 智能:Scons繼承了autoconf/automake的功能,自動(dòng)解析系統(tǒng)的include路徑、typedef等;“以全局的觀點(diǎn)來看所有的依賴關(guān)系”

2.scons文件

    scons中可能出現(xiàn)的文件:
        SConstruct,Sconstruct,sconstruct,SConscript

    scons將在當(dāng)前目錄以下次序 SConstruct,Sconstruct,sconstruct 來搜索配置文件,從讀取的第一個(gè)文件中讀取相關(guān)配置。
    在配置文件SConstruct中可以使用函數(shù)SConscript()函數(shù)來定附屬的配置文件。按慣例,這些附屬配置文件被命名為”SConscript”,當(dāng)然也可以使用任意其它名字。

3.scons的命令行參數(shù)

1     scons: 執(zhí)行SConstruct中腳本2     scons -c   clean3     scons -Q  只顯示編譯信息,去除多余的打印信息4     scons -Q   --implicit-cache hello 保存依賴關(guān)系5                    --implicit-deps-changed   強(qiáng)制更新依賴關(guān)系6                    --implicit-deps-unchanged  強(qiáng)制使用原先的依賴關(guān)系,即使已經(jīng)改變

4.SConstruct提供的方法

4.1 PRogram:生成可執(zhí)行文件

1     Program('hello.c')                         //編譯hello.c可執(zhí)行文件,根據(jù)系統(tǒng)自動(dòng)生成(hello.exe on Windows; hello on POSIX)2     Program('hello','hello.c')                    //指定Output文件名(hello.exe on Windows; hello on POSIX)3     Program(['hello.c', 'file1.c', 'file2.c'])            //編譯多個(gè)文件,Output文件名以第一個(gè)文件命名4     Program(source = "hello.c",target = "hello")5     Program(target = "hello" , source = "hello.c")6     Program('hello', Split('hello.c file1.c file2.c'))       //編譯多個(gè)文件7 8     Program(Glob("*.c"))9     src = ["hello.c","foo.c"];Program(src)

4.2 Object:生成目標(biāo)文件

1     Object('hello.c')                         //編譯hello.c目標(biāo)文件,根據(jù)系統(tǒng)自動(dòng)生成(hello.obj on Windows; hello.o on POSIX)

4.3 Library:生成靜態(tài)/動(dòng)態(tài)庫(kù)文件

1 Library('foo', ['f1.c', 'f2.c', 'f3.c'])               //編譯library2 SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])            //編譯 shared library3 StaticLibrary('bar', ['f4.c', 'f5.c', 'f6.c'])            //編譯 static library

 庫(kù)的使用:

1  Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.')        //連接庫(kù),不需加后綴或是前綴

4.4 SourceSignatures:判斷源文件是否修改

1     SourceSignatures('md5')                       //根據(jù)內(nèi)容是否改變,默認(rèn)方式2     SourceSignatures('timestamp')                  //根據(jù)修改時(shí)間

4.5 TargetSignatures:判斷目標(biāo)文件是否改變

1     TargetSignatures('build')                     //根據(jù)編譯結(jié)果2     TargetSignatures('content')                    //根據(jù)文件內(nèi)容,如果只是加了句注釋,將不會(huì)被重新編譯

4.6 Ignore:忽略依賴關(guān)系

1     Ignore(hello, 'hello.h')                     //忽略某個(gè)依賴關(guān)系

4.7 Depends:明確依賴關(guān)系

1 Depends(hello, 'other_file')                     //明確依賴關(guān)系 

4.8 SConscript:scons的配置文件

    源文件的目錄結(jié)構(gòu)如下:
    src:
    |    SConstruct
    |    test.cpp
    |    mA(目錄):
         |     SConscript
         |     func.cpp
    其中test.cpp為主文件,中調(diào)用func.cpp中定義的函數(shù)
  
    SConstruct內(nèi)容如下:

1 env = Environment()2 flags = env.ParseFlags(['-pthread -I/usr/include/stlport ',' -L .'])3 env.MergeFlags(class_flags)4 subobj = SConscript(['mA/SConscript'])5 obj = subobj + env.Object(Glob("*.cpp"))6 env.Program("test",list(obj),LIBS = ['libstlport.a'])

mA/SConscrip如下:

1 obj = Object(Glob("*.cpp"))2 Return("obj")

不出意外的話上邊的工程編譯可以通過,但是運(yùn)行的時(shí)候會(huì)Aborted。因?yàn)閠est.cpp,mA/func.cpp都使用了包含string類型的那個(gè)類,但是由于編譯環(huán)境的不同,test.cpp認(rèn)為string變量的大小是24字節(jié), mA/func.cpp認(rèn)為string變量的大小是4個(gè)字節(jié)(libstlport.a搗的鬼)。

     解決問題的辦法就是環(huán)境變量輸出,修改SConstruct和mA/SConscript如下:
    SConstruct:

1 env = Environment()2 flags = env.ParseFlags(['-pthread -I/usr/include/stlport ',' -L .'])3 env.MergeFlags(class_flags)4 Export('env')5 subobj = SConscript(['mA/SConscript'],exports = 'env')6 obj = subobj + env.Object(Glob("*.cpp"))7 env.Program("test",list(obj),LIBS = ['libstlport.a'])

mA/SConscript:

1 Import('env')2 obj = env.Object(Glob("*.cpp"))3 Return("obj")

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 林芝县| 宁城县| 满洲里市| 天全县| 四平市| 阳春市| 武威市| 嫩江县| 丰顺县| 平果县| 景德镇市| 哈密市| 江川县| 勐海县| 新乐市| 福建省| 武宣县| 永吉县| 保亭| 修水县| 巨野县| 金昌市| 大荔县| 若羌县| 清水县| 英德市| 溧阳市| 静海县| 淳化县| 龙山县| 德化县| 耿马| 安达市| 云梦县| 吉木乃县| 德江县| 托克逊县| 营口市| 嘉兴市| 富蕴县| 昆明市|