读书笔记---编译程序中的三板斧
生活随笔
收集整理的這篇文章主要介紹了
读书笔记---编译程序中的三板斧
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
平時(shí)安裝軟件安裝多了,總是少不了./confgiure;make;make install 這三條命令
然而,軟件安裝完畢,各位有想過這幾條命令的意義么?
???? 今天早上看書的時(shí)候,談到C編譯程序及調(diào)試,于是將書中所說總結(jié)出來,以供大家分享吧。
???? 通常一個(gè)源碼包解壓縮以后,我們ls一下,能看到configure文件,通常這是一個(gè)可執(zhí)行腳本文件。由這個(gè)腳本文件加上參數(shù),經(jīng)過運(yùn)行,生成Makefile文件和其他的一些必要的文件
???? 如果ls沒有發(fā)現(xiàn)configure文件的話,你第一步執(zhí)行./configure是沒用的。只會(huì)得到一條shell返回的錯(cuò)誤提示。那么沒有configure的程序我們要如何編譯呢,通常我們可以看README和INSTALL文件,里面會(huì)提示我們用一些其他的程序來生成configure文件。
比如perl腳本寫的Makefile.pl,可以用perl Makefile.pl來生成Makefile。
????? 有些程序在執(zhí)行之前可能需要打上補(bǔ)丁,通常可以找到一些patch文件,
常用 patch -p1 < filename.patch的方法給源碼打上補(bǔ)丁。
???? configrue的開始基本上都是檢查編譯環(huán)境,如gcc編譯器的位置,各種庫和頭文件的位置等等。當(dāng)檢測(cè)遇到錯(cuò)誤就會(huì)停下來。并輸出錯(cuò)誤信息。對(duì)于redhat,建議在安裝系統(tǒng)的時(shí)候就把開發(fā)工具等都全部選中,這樣避免編譯的時(shí)候臨時(shí)去安裝需要的編譯工具和一些缺少的庫。
???? 有時(shí)候我們的系統(tǒng)少一些其他的庫,是導(dǎo)致我們編譯失敗的原因。默認(rèn)情況下,我們都是運(yùn)行make來調(diào)用系統(tǒng)工具對(duì)C代碼進(jìn)行編譯。對(duì)于某些軟件,make后面的參數(shù)很長(zhǎng),也比較復(fù)雜,這些參數(shù)都是什么意思呢。
用postfix舉例吧
make -f Makefile.init makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH -I/usr/local/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lm -L/usr/local/lib -lsasl2'
? 這一大串輸入起來是不是很費(fèi)勁。分別解釋一下吧
-I路徑?? 表示在指定路徑搜索頭文件
-lz??????? 表示搜索libz.so或者libz.a,這里用了縮寫的形式,只寫了一個(gè)z,同理lmysqlclient就表示libmysqlclient.so/libmysqlclient.a
CCARGS表示宏。用于替換makefile中的默認(rèn)值
make的過程中會(huì)生成很多中間文件*.o,最后連接成為可執(zhí)行文件。make一般時(shí)間比較長(zhǎng),取決于CPU的性能了。
接下來一般就是make install了,可是為什么是install參數(shù)呢,可以man make看一下,你會(huì)發(fā)現(xiàn)并沒有install這個(gè)參數(shù),那么這個(gè)參數(shù)是哪里來的呢
如果你還沒有刪除剛才的文件,你可以用編輯器打開Makefile看一下。這里么定義了很多目標(biāo)字段,格式如下
targert: prerequisite-list
TAB construction-commands
這里的TAB表示一個(gè)制表符號(hào),也就是幾個(gè)像空格一樣的空白。
用查找命令從最后找一下,你能找到install開頭的目標(biāo)字段,如果你熟悉程序,你會(huì)發(fā)現(xiàn),安裝的動(dòng)作就是從這里開始的。
默認(rèn)情況下make后面沒有指定字段,就從第一個(gè)字段開始。當(dāng)make完成后,我們?cè)俅螆?zhí)行make命令是沒有效果的,會(huì)提示你沒有什么可以執(zhí)行了。因此我們指定一個(gè)程序中定義的字段install,來執(zhí)行特定的安裝動(dòng)作。
對(duì)于某些小程序來說,make可能直接就完成了編譯和安裝的動(dòng)作,而有些程序是用make
all來完成的。對(duì)于一些大型軟件,make install之后還可以執(zhí)行make install-config來安裝配置文件等等。現(xiàn)在你明白為啥是make install而不是make love了吧。哈哈
編譯失敗,需要清理代碼樹,通常我們用make clean或者make distclean,毫無疑問,這兩個(gè)參數(shù)也是在Makefile中定義好了
如果Makefile中定義了uninstall參數(shù),那么該程序還能卸載。
?????? 就到此為止吧。對(duì)于編譯還有一些其他的開關(guān),有興趣可以看看相關(guān)的開發(fā)的書。
??
本文出自 “風(fēng)吹云動(dòng)” 博客,請(qǐng)務(wù)必保留此出處[url]http://coolerfeng.blog.51cto.com/133059/88161[/url]本文出自 51CTO.COM技術(shù)博客
然而,軟件安裝完畢,各位有想過這幾條命令的意義么?
???? 今天早上看書的時(shí)候,談到C編譯程序及調(diào)試,于是將書中所說總結(jié)出來,以供大家分享吧。
???? 通常一個(gè)源碼包解壓縮以后,我們ls一下,能看到configure文件,通常這是一個(gè)可執(zhí)行腳本文件。由這個(gè)腳本文件加上參數(shù),經(jīng)過運(yùn)行,生成Makefile文件和其他的一些必要的文件
???? 如果ls沒有發(fā)現(xiàn)configure文件的話,你第一步執(zhí)行./configure是沒用的。只會(huì)得到一條shell返回的錯(cuò)誤提示。那么沒有configure的程序我們要如何編譯呢,通常我們可以看README和INSTALL文件,里面會(huì)提示我們用一些其他的程序來生成configure文件。
比如perl腳本寫的Makefile.pl,可以用perl Makefile.pl來生成Makefile。
????? 有些程序在執(zhí)行之前可能需要打上補(bǔ)丁,通常可以找到一些patch文件,
常用 patch -p1 < filename.patch的方法給源碼打上補(bǔ)丁。
???? configrue的開始基本上都是檢查編譯環(huán)境,如gcc編譯器的位置,各種庫和頭文件的位置等等。當(dāng)檢測(cè)遇到錯(cuò)誤就會(huì)停下來。并輸出錯(cuò)誤信息。對(duì)于redhat,建議在安裝系統(tǒng)的時(shí)候就把開發(fā)工具等都全部選中,這樣避免編譯的時(shí)候臨時(shí)去安裝需要的編譯工具和一些缺少的庫。
???? 有時(shí)候我們的系統(tǒng)少一些其他的庫,是導(dǎo)致我們編譯失敗的原因。默認(rèn)情況下,我們都是運(yùn)行make來調(diào)用系統(tǒng)工具對(duì)C代碼進(jìn)行編譯。對(duì)于某些軟件,make后面的參數(shù)很長(zhǎng),也比較復(fù)雜,這些參數(shù)都是什么意思呢。
用postfix舉例吧
make -f Makefile.init makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH -I/usr/local/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lm -L/usr/local/lib -lsasl2'
? 這一大串輸入起來是不是很費(fèi)勁。分別解釋一下吧
-I路徑?? 表示在指定路徑搜索頭文件
-lz??????? 表示搜索libz.so或者libz.a,這里用了縮寫的形式,只寫了一個(gè)z,同理lmysqlclient就表示libmysqlclient.so/libmysqlclient.a
CCARGS表示宏。用于替換makefile中的默認(rèn)值
make的過程中會(huì)生成很多中間文件*.o,最后連接成為可執(zhí)行文件。make一般時(shí)間比較長(zhǎng),取決于CPU的性能了。
接下來一般就是make install了,可是為什么是install參數(shù)呢,可以man make看一下,你會(huì)發(fā)現(xiàn)并沒有install這個(gè)參數(shù),那么這個(gè)參數(shù)是哪里來的呢
如果你還沒有刪除剛才的文件,你可以用編輯器打開Makefile看一下。這里么定義了很多目標(biāo)字段,格式如下
targert: prerequisite-list
TAB construction-commands
這里的TAB表示一個(gè)制表符號(hào),也就是幾個(gè)像空格一樣的空白。
用查找命令從最后找一下,你能找到install開頭的目標(biāo)字段,如果你熟悉程序,你會(huì)發(fā)現(xiàn),安裝的動(dòng)作就是從這里開始的。
默認(rèn)情況下make后面沒有指定字段,就從第一個(gè)字段開始。當(dāng)make完成后,我們?cè)俅螆?zhí)行make命令是沒有效果的,會(huì)提示你沒有什么可以執(zhí)行了。因此我們指定一個(gè)程序中定義的字段install,來執(zhí)行特定的安裝動(dòng)作。
對(duì)于某些小程序來說,make可能直接就完成了編譯和安裝的動(dòng)作,而有些程序是用make
all來完成的。對(duì)于一些大型軟件,make install之后還可以執(zhí)行make install-config來安裝配置文件等等。現(xiàn)在你明白為啥是make install而不是make love了吧。哈哈
編譯失敗,需要清理代碼樹,通常我們用make clean或者make distclean,毫無疑問,這兩個(gè)參數(shù)也是在Makefile中定義好了
如果Makefile中定義了uninstall參數(shù),那么該程序還能卸載。
?????? 就到此為止吧。對(duì)于編譯還有一些其他的開關(guān),有興趣可以看看相關(guān)的開發(fā)的書。
??
本文出自 “風(fēng)吹云動(dòng)” 博客,請(qǐng)務(wù)必保留此出處[url]http://coolerfeng.blog.51cto.com/133059/88161[/url]本文出自 51CTO.COM技術(shù)博客
轉(zhuǎn)載于:https://blog.51cto.com/betterliu/98759
總結(jié)
以上是生活随笔為你收集整理的读书笔记---编译程序中的三板斧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于移动设备的Wifi开发组件
- 下一篇: 推荐技术博客