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