cmake,make,nmake的用法
于是開始找跨平臺的編譯工具,其中最有名的兩個是 cmake 和 scons,cmake 之所以出名估計是因為 KDE 4 從 autotools 轉(zhuǎn)向用 cmake 來編譯。而 scons 則是 lighttpd 原來用的編譯工具,它現(xiàn)在也轉(zhuǎn)向 Python 了。cmake 和 python 大概代表了新一代跨平臺編譯工具的兩種方向。第一種 (cmake) 是延續(xù)并改良傳統(tǒng) automake, autoconf 工具鏈,將之合為一體,但最終仍然生成 Makefile, Visual Studio 的 .sln,Xcode 的 .xcodebuild 文件,依賴現(xiàn)有編譯工具 (make, nmake, vcbuild, xcodebuild) 來編譯;第二種則是完全消除現(xiàn)有編譯工具的調(diào)用,直接調(diào)用編譯器,scons 就屬于這一類 (scons 還有一個特點是完全不用專門的語言,控制編譯的腳本就是 Python)。
從人氣上 來說,反倒是走改良路線的 cmake 比 scons 好一些,有幾個原因:scons 基于 Python,可能有些代碼不是很照顧速度,于是類似 KDE 這樣的大項目編譯起來會很慢;scons 開發(fā)比較慢,最近一直只是 bugfix。不過相對 cmake,scons 的優(yōu)點是文檔非常細致可讀,而 cmake 的文檔則非常少,可以在網(wǎng)上找到的只有幾篇介紹性的文章和參考手冊,不像 scons 有一本 User Guide。
與之相關(guān)的工具還有 Jam (包括它的變體 FTJam, Boost.Build), Waf, Bakefile 等。其中比較新的 Waf 是一個 scons 的改進,在它的提供的 benchmark 中,顯示通過緩存方式可以大大改進編譯的速度。不過因為這個項目還很新,目前沒有什么軟件用它作為編譯系統(tǒng)。
Bakefile 走的則是 cmake 的路子,從名稱上也可以看出,它最終也是通過生成 Makefile 一類的文件來完成編譯的。不過不同的地方在于 cmake 用的語法很像 autotools 用的 m4 的傳統(tǒng)語法,而 bakefile 則完全用 XML 來定義編譯規(guī)則了,這一點倒很像 ant。Bakefile 倒是有不少著名的項目使用,比如 wxWidgets, WebKit, VCF, libxml。
?
目的:
基本掌握了 make 的用法,能在Linux系統(tǒng)上編程。
環(huán)境:
Linux系統(tǒng),或者有一臺Linux服務(wù)器,通過終端連接。一句話:有Linux編譯環(huán)境。
準備:
準備三個文件:file1.c, file2.c, file2.h
file1.c:
#include
#include "file2.h"
int main()
{
printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n");
File2Print();
return 0;
}
file2.h:
#ifndef FILE2_H_
#define FILE2_H_
#ifdef __cplusplus
extern "C" {
#endif
void File2Print();
#ifdef __cplusplus
}
#endif
#endif
file2.c:
#include "file2.h"
void File2Print()
{
printf("Print file2**********************\n");
}
基礎(chǔ):
先來個例子:
有這么個Makefile文件。(文件和Makefile在同一目錄)
=== makefile 開始 ===
helloworld:file1.o file2.o
gcc file1.o file2.o -o helloworld
file1.o:file1.c file2.h
gcc -c file1.c -o file1.o
file2.o:file2.c file2.h
gcc -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 結(jié)束 ===
一個 makefile 主要含有一系列的規(guī)則,如下:
A: B
(tab)
(tab)
每個命令行前都必須有tab符號。
上面的makefile文件目的就是要編譯一個helloworld的可執(zhí)行文件。讓我們一句一句來解釋:
helloworld : file1.o file2.o: helloworld依賴file1.o file2.o兩個目標文件。
gcc File1.o File2.o -o helloworld: 編譯出helloworld可執(zhí)行文件。-o表示你指定 的目標文件名。
file1.o : file1.c: file1.o依賴file1.c文件。
gcc -c file1.c -o file1.o: 編譯出file1.o文件。-c表示gcc 只把給它的文件編譯成目標文件, 用源碼文件的文件名命名但把其后綴由“.c”或“.cc”變成“.o”。在這句中,可以省略-o file1.o,編譯器默認生成file1.o文件,這就是-c的作用。
file2.o : file2.c file2.h
gcc -c file2.c -o file2.o
這兩句和上兩句相同。
clean:
rm -rf *.o helloworld
當用戶鍵入make clean命令時,會刪除*.o 和helloworld文件。
如果要編譯cpp文件,只要把gcc改成g++就行了。
寫好Makefile文件,在命令行中直接鍵入make命令,就會執(zhí)行Makefile中的內(nèi)容了。
到這步我想你能編一個Helloworld程序了。
?
Makefile的關(guān)鍵是:
1。dependence rule;
2。action;
3。variable assignment and shell scripts.
Dependence rule寫的是文件間的依賴關(guān)系,比如a.out是由a.o和libmylib.a生成的,a.o是由a.C編譯而來的。寫成makefile的dependence rule就是:
a.out:a.o libmylib.a
你可以用些的符號來寫些通用的dependence rule,比如:
.C.o:
%.o:%.C
它的意思是所有的.o文件依賴于對應(yīng)的.C文件。不同的make(比如GNU make,Sun make等)可能有不同的特殊符號。
Action就是定義該做什么,比如:
a.out:a.o libmylib.a
CC -o a.out a.o -lmylib
第一行是dependence rule,第二行是對應(yīng)的動作。它們的意思是,如果a.o或libmylib.a比a.out新,就執(zhí)行第二行。再如:
.C.o:
%.o:%.C
CC -g -c $<
意思是如果然后.C文件比對應(yīng)的.o文件新,就編譯它。注意,action rule一定不能用空格起頭而是tab起頭。
變量的賦值很簡單:
<變量>=<值>
比如:
INCLUDEDIR=$(PROJECT_HOME)/include $(THIRDPARTY_HOME)/include
用變量時一定要用小括號:
.C.o:
CC -g -c $(INCLUDEDIR) $<
Shell script可能要先聲明用什么shell:
SHELL=/usr/bin/sh
在makefile里寫shell script和其它地方有許多不同。其中最大的不同是makefile中的shell script不能隨便放換行符,我一般是把它們放用續(xù)行符("\")連起來.??
?
要使VC產(chǎn)生*.MAK文件,你可以這樣:
打開Tools菜單------------>Options------------------------->Build選項卡 ---------------------->在"Export makefile when saving project file"前面得方框打勾
如果您喜歡在命令行下工作,您需要執(zhí)行在Developer Studio的BIN子目錄下的VCVARS32.BAT來設(shè)置環(huán)境變數(shù)。要從命令行執(zhí)行make檔案,可以轉(zhuǎn)到你得工程目錄比如HelloMsg并執(zhí)行:
NMAKE /f HelloMsg.mak CFG="HelloMsg - Win32 Debug"
或者
NMAKE /f HelloMsg.mak CFG="HelloMsg - Win32 Release"
然後您可通過輸入:
DEBUG\HELLOMSG
或者
RELEASE\HELLOMSG
從命令列執(zhí)行.EXE檔案。?
?
http://hi.baidu.com/jian_fei_yang/item/d4f4462ffd35900943634af8原文:
轉(zhuǎn)載于:https://www.cnblogs.com/PursuitOnly/archive/2013/01/07/2849661.html
總結(jié)
以上是生活随笔為你收集整理的cmake,make,nmake的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马斯克:Model Y将成特斯拉最赚钱的
- 下一篇: 理想ONE高速起火被烧成空壳 “汽车黑匣