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