c++构建工具之shell,configure,make,cmake,scons,xmake简析总结
前言
說(shuō)到編譯工具,在windows下必言vs,在linux下必言make。
0.shell
如果編譯一個(gè)庫(kù)的命令太復(fù)雜或者為了方便,我們更愿意將編譯命令寫(xiě)成一個(gè)shell腳本來(lái)執(zhí)行,比如build.sh編譯ffmpeg:
#!/bin/sh ./configure --prefix=$(pwd)/../../seemideo/thirdparty/lib/ffmpeg-3.2.3 \--enable-gpl --enable-libx264 --enable-shared --disable-static --enable-vaapi \--enable-cuda --enable-cuvid --enable-nonfree --enable-pic --enable-libfreetype --enable-postproc --extra-libs="$(pkg-config --libs libva-drm libva-x11 libva)" \--extra-cflags="$(pkg-config --cflags libva-drm libva-x11 libva) -pg" \--extra-cflags=-I/usr/local/cuda-8.0/include --extra-libs=-L/usr/local/cuda-8.0/lib64 \--enable-sse42 && make -j8 && make install實(shí)際上shell稱(chēng)不上一個(gè)構(gòu)建工具,只是腳本的一個(gè)功能,之所以要把shell放在這里,是因?yàn)橄旅婺切┕ぞ叨际穷?lèi)似shell腳本的語(yǔ)法,如果你熟練使用shell,使用其他幾種工具構(gòu)建工程將不是問(wèn)題。
1.make
makefile會(huì)根據(jù)文件的時(shí)間修改編譯那些修改過(guò)的文件,而不是編譯全部工程文件。
執(zhí)行一個(gè)make命令,將在目錄下搜索名稱(chēng)為makefile或者M(jìn)akefile的文件執(zhí)行命令。
生成動(dòng)態(tài)庫(kù)就加編譯選項(xiàng) -shared -fPIC 將生成.so
生成靜態(tài)庫(kù)是使用 ar 命令將編譯成的.o打包成.a
Makefile的規(guī)則
在講述這個(gè)Makefile之前,還是讓我們先來(lái)粗略地看一看Makefile的規(guī)則。
??? 一個(gè)目標(biāo) : 生成目標(biāo)的多個(gè)依賴(lài)
????????? 生成目標(biāo)的命令
??? target也就是一個(gè)目標(biāo)文件,可以是Object File,也可以是執(zhí)行文件。還可以是一個(gè)標(biāo)簽(Label),對(duì)于標(biāo)簽這種特性,在后續(xù)的“偽目標(biāo)”章節(jié)中會(huì)有敘述。
??? prerequisites就是,要生成那個(gè)target所需要的文件或是目標(biāo)。
??? command也就是make需要執(zhí)行的命令。(任意的Shell命令)
這是一個(gè)文件的依賴(lài)關(guān)系,也就是說(shuō),target這一個(gè)或多個(gè)的目標(biāo)文件依賴(lài)于prerequisites中的文件,其生成規(guī)則定義在command中。說(shuō)白一點(diǎn)就是說(shuō),prerequisites中如果有一個(gè)以上的文件比target文件要新的話(huà),command所定義的命令就會(huì)被執(zhí)行。這就是Makefile的規(guī)則。也就是Makefile中最核心的內(nèi)容。
makefile在編譯的時(shí)候就是從第一個(gè)目標(biāo)尋找依賴(lài),不斷的尋找下一個(gè)依賴(lài)的目標(biāo),生成下一個(gè)目標(biāo),不斷的嵌套生成的目標(biāo)。
現(xiàn)在的c,c++開(kāi)源工具很多,在linux下大部分都提供源碼安裝,我們常用的就是三步:
第一步 ./configure
根據(jù)系統(tǒng)配置設(shè)置編譯工具鏈,根據(jù)各種宏開(kāi)關(guān)編譯啟用模塊,根指定編譯完成后make install安裝的路徑,生成makefile,
第二步 make
根據(jù)上步生成的makefile,執(zhí)行make中工具鏈編譯代碼
第三步 make install
將生成的include,lib,share,bin拷貝到configure時(shí)指定的目錄
2.cmake
由于復(fù)雜的工程編寫(xiě)makefile太繁瑣,所以一般都是根據(jù)配置生成makefile,所以就出現(xiàn)了cmake,根據(jù)一個(gè)CMakeList.txt的腳本生成makefile。
cmake在windows下支持命令行,也支持很多人喜歡的gui工具,并可以生成vs的工程,cmake本質(zhì)上來(lái)說(shuō)就是make,只不過(guò)大型工程的makefile太困難,所以一般是使用cmake的CMakeList.txt規(guī)則生成makefile,然后編譯。
cmake在windows的gui界面:
在configue的時(shí)候選擇編譯工具,然后可以在上面的列表中修改一些路徑和宏定義開(kāi)關(guān),gernerate就可以生成vs的工程了,可以后面的打開(kāi)工程項(xiàng)目了
3.scons
scons將在當(dāng)前目錄以下次序 SConstruct,Sconstruct,sconstruct 來(lái)搜索配置文件。
SCons 是一個(gè)開(kāi)放源代碼、以 Python 語(yǔ)言編寫(xiě)的下一代的程序建造工具。它最初的名字是 ScCons, 基于由 perl 語(yǔ)言編寫(xiě)的 Cons 軟件開(kāi)發(fā)而成,它在 2000 年 8 月獲得了由 Software Carpentry 舉辦的 SC 建造比賽的大獎(jiǎng)。現(xiàn)在 ScCons 已經(jīng)被改名為 SCons,目的是為了表示不再與 Software Carpentry 有聯(lián)系,當(dāng)然,還有一個(gè)目的,就是為了更方便的輸入。可以在linux和windows下使用,由于是基于python語(yǔ)言完成,所以在安裝使用scons之前要安裝python。
SCons 具有以下優(yōu)點(diǎn):
- 使用 Python 腳本做為配置文件
- 對(duì)于 C,C++ 和 Fortran, 內(nèi)建支持可靠自動(dòng)依賴(lài)分析 . 不用像 make 工具那樣需要執(zhí)行"make depends"和"make clean"就可以獲得所有的依賴(lài)關(guān)系。
- 內(nèi)建支持 C, C++, D, Java, Fortran, Yacc, Lex, Qt,SWIG 以及 Tex/Latex。用戶(hù)還可以根據(jù)自己的需要進(jìn)行擴(kuò)展以獲得對(duì)需要編程語(yǔ)言的支持。
- 支持 make -j 風(fēng)格的并行建造。相比 make -j, SCons 可以同時(shí)運(yùn)行 N 個(gè)工作,而不用擔(dān)心代碼的層次結(jié)構(gòu)。
- 使用 Autoconf 風(fēng)格查找頭文件,函數(shù)庫(kù),函數(shù)和類(lèi)型定義。
- 良好的夸平臺(tái)性。SCons 可以運(yùn)行在 Linux, AIX, BSD, HP/UX, IRIX, Solaris, Windows, Mac OS X 和 OS/2 上。
scons生成動(dòng)態(tài)庫(kù),靜態(tài)庫(kù),執(zhí)行程序的接口如下:
Program('hello',['hello.c']) 生成可執(zhí)行文件
SharedLibrary('hello', ['f1.c', 'f2.c', 'f3.c']) 生成動(dòng)態(tài)庫(kù)
StaticLibrary('test', ['f4.c', 'f5.c', 'f6.c']) 生成靜態(tài)庫(kù)
下面是一個(gè)示例腳本:
4.xmake
XMake 是一個(gè)基于 Lua 的輕量級(jí)跨平臺(tái)自動(dòng)構(gòu)建工具,支持在各種主流平臺(tái)上構(gòu)建項(xiàng)目,使用模板生成工程。
xmake 的目標(biāo)是開(kāi)發(fā)者更加關(guān)注于項(xiàng)目本身開(kāi)發(fā),簡(jiǎn)化項(xiàng)目的描述和構(gòu)建,并且提供平臺(tái)無(wú)關(guān)性,使得一次編寫(xiě),隨處構(gòu)建。
它跟 cmake 、 automake 、 premake 有點(diǎn)類(lèi)似,但是機(jī)制不同,它默認(rèn)不會(huì)去生成 IDE 相關(guān)的工程文件,采用直接編譯,并且更加的方便易用采用 lua 的工程描述語(yǔ)法更簡(jiǎn)潔直觀,支持在大部分常用平臺(tái)上進(jìn)行構(gòu)建,以及交叉編譯。
并且 xmake 提供了創(chuàng)建、配置、編譯、打包、安裝、卸載、運(yùn)行等一些 actions ,使得開(kāi)發(fā)和構(gòu)建更加的方便和流程化。
不僅如此,它還提供了許多更加高級(jí)的特性,例如插件擴(kuò)展、腳本宏記錄、批量打包、自動(dòng)文檔生成等等。
這里只是作為一個(gè)總結(jié),對(duì)于makefile的語(yǔ)法這里叫不在講解了,不過(guò)各種各種的出現(xiàn)都是為了解決現(xiàn)階段的問(wèn)題而誕生的。
另外有premake,autotools的構(gòu)建工具。支持特性
-
支持 windows 、 mac 、 linux 、 ios 、 android 等平臺(tái),自動(dòng)檢測(cè)不同平臺(tái)上的編譯工具鏈(也可手動(dòng)配置)編譯 windows 項(xiàng)目采用原生 vs 的工具鏈,不需要使用 cygwin 、 mingw (當(dāng)然這些也支持)
-
支持自定義平臺(tái)編譯配置,可以很方便的擴(kuò)展第三方平臺(tái)支持
-
采用 lua 腳本語(yǔ)法描述項(xiàng)目,描述規(guī)則簡(jiǎn)單高效,邏輯規(guī)則可靈活修改,并且不會(huì)生成相關(guān)平臺(tái)的工程文件,是工程更加簡(jiǎn)單明了
-
支持創(chuàng)建模板工程、配置項(xiàng)目、編譯項(xiàng)目、運(yùn)行、打包、安裝和卸載等常用功能(后續(xù)還會(huì)增加:自動(dòng)生成文檔、調(diào)試等模塊)
-
支持編譯 c/c++/objc/swift 成靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)、命令行可執(zhí)行程序
-
提供豐富的工程描述 api ,使用簡(jiǎn)單靈活,例如添加編譯文件只需(還支持過(guò)濾排除):
add_files("src/*.c", "src/asm/**.S", "src/*.m")
-
支持頭文件、接口、鏈接庫(kù)依賴(lài)、類(lèi)型的自動(dòng)檢測(cè),并可自動(dòng)生成配置頭文件 config.h
-
支持自定義編譯配置開(kāi)關(guān),例如如果在工程描述文件中增加了enable_xxx的開(kāi)關(guān),那么配置編譯的時(shí)候就可以手動(dòng)進(jìn)行配置來(lái)啟用它:
xmake config --enable_xxx=y
-
提供一鍵打包功能,不管在哪個(gè)平臺(tái)上進(jìn)行打包,都只需要執(zhí)行一條相同的命令,非常的方便
-
支持全局配置,一些常用的項(xiàng)目配置,例如工具鏈、規(guī)則描述等等,都可以進(jìn)行全局配置,這樣就不需要每次編譯不同工程,都去配置一遍
-
除了可以自動(dòng)檢測(cè)依賴(lài)模塊,也支持手動(dòng)強(qiáng)制配置模塊,還有各種編譯 flags 。
-
支持插件擴(kuò)展、平臺(tái)擴(kuò)展、模板擴(kuò)展、選項(xiàng)自定義等高級(jí)功能
-
提供一些內(nèi)置的常用插件(例如:自動(dòng)生成 doxygen 文檔插件,宏腳本記錄和運(yùn)行插件)
-
宏記錄插件里面提供了一些內(nèi)置的宏腳本(例如:批量打包一個(gè)平臺(tái)的所有 archs 等),也可以在命令行中手動(dòng)記錄宏并回放執(zhí)行
-
提供強(qiáng)大的 task 任務(wù)機(jī)制
-
不依賴(lài) makefile 和 make ,實(shí)現(xiàn)直接編譯,內(nèi)置自動(dòng)多任務(wù)加速編譯, xmake 是一個(gè)真正的構(gòu)架工具,而不僅僅是一個(gè)工程文件生成器
-
自動(dòng)檢測(cè) ccache ,進(jìn)行自動(dòng)緩存提升構(gòu)建速度
使用xmake模板創(chuàng)建一個(gè)c++ console項(xiàng)目:
??? xmake create -l c++ -t 1 console
或者
? ? xmake create --language=c++ --template=1 console
工程描述文件:xmake.lua
target("console")
??? set_kind("binary")
??? add_files("src/*.c")
xmake提供了一些常用工程模板,可以很方便的創(chuàng)建一些空工程。
創(chuàng)建一個(gè)c++ console項(xiàng)目:
??? xmake create -l c++ -t 1 demo
?or xmake create --language=c++ --template=1 demo
創(chuàng)建一個(gè)c靜態(tài)庫(kù)項(xiàng)目:
??? xmake create -l c -t 5 demo
?or xmake create --language=c --template=5 demo
創(chuàng)建一個(gè)c動(dòng)態(tài)庫(kù)項(xiàng)目:
??? xmake create -t 3 demo
?or xmake create --template=3 demo
默認(rèn)語(yǔ)言是c, 后面的-t和--template參數(shù)指定的是需要?jiǎng)?chuàng)建的模板類(lèi)型,目前只支持console、靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)三種模板,后續(xù)還會(huì)支持:application等app應(yīng)用程序模板。
下面是一些模板選項(xiàng)定義:
??? -l LANGUAGE, --language=LANGUAGE?????? The project language (default: c)
?????????????????????????????????????????????? - c
?????????????????????????????????????????????? - c++
?????????????????????????????????????????????? - objc
?????????????????????????????????????????????? - objc++
?????????????????????????????????????????????? - swift
??? -t TEMPLATE, --template=TEMPLATE?????? Select the project template id of the given language. (default: 1)
?????????????????????????????????????????????? - language: c
???????????????????????????????????????????????? 1. The Console Program
???????????????????????????????????????????????? 2. The Console Program (tbox)
???????????????????????????????????????????????? 3. The Shared Library
???????????????????????????????????????????????? 4. The Shared Library (tbox)
???????????????????????????????????????????????? 5. The Static Library
???????????????????????????????????????????????? 6. The Static Library (tbox)
?????????????????????????????????????????????? - language: c++
???????????????????????????????????????????????? 1. The Console Program
???????????????????????????????????????????????? 2. The Console Program (tbox)
???????????????????????????????????????????????? 3. The Shared Library
???????????????????????????????????????????????? 4. The Shared Library (tbox)
???????????????????????????????????????????????? 5. The Static Library
???????????????????????????????????????????????? 6. The Static Library (tbox)
?????????????????????????????????????????????? - language: objc
???????????????????????????????????????????????? 1. The Console Program
?????????????????????????????????????????????? - language: objc++
???????????????????????????????????????????????? 1. The Console Program
?????????????????????????????????????????????? - language: swift
???????????????????????????????????????????????? 1. The Console Program
5.參考資料
make
http://blog.csdn.net/haoel/article/details/2886
http://www.cnblogs.com/wang_yb/p/3990952.html
http://www.cnblogs.com/sky1991/archive/2012/11/15/2771348.html
scons
http://blog.csdn.net/sealyao/article/details/6402257
http://www.linuxidc.com/Linux/2013-02/79467.htm
https://www.ibm.com/developerworks/cn/linux/l-cn-scons/
cmake
http://blog.csdn.net/xuguangsoft/article/details/8162757
http://blog.csdn.net/dbzhang800/article/details/6314073
http://blog.csdn.net/dbzhang800/article/details/6329068
xmake
https://segmentfault.com/a/1190000004235989
http://blog.csdn.net/earbao/article/details/52238568
總結(jié)
以上是生活随笔為你收集整理的c++构建工具之shell,configure,make,cmake,scons,xmake简析总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++中四种类型转换符:static_c
- 下一篇: c++构建工具之xmake使用实例