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