學習編譯並運行C代碼
以《UNIX網絡編程》中的代碼為例,學習如何編譯並運行C代碼。
根據 UNIX網絡編程(第3版)環境搭建——使用MAC OSX10.10,能夠成功運行
1、下載本書的頭文件及示例源碼
原書地址:http://www.unpbook.com/src.html2、解壓unpv13e.tar.gz
3、切換到unpv13文件夾後依次執行
./configure cd lib make cd ../libfree make
此處出現了報錯:
inet_ntop.c:56:1: error: conflicting types for ‘inet_ntop‘
inet_ntop(af, src, dst, size)
^
/usr/include/arpa/inet.h:77:13: note: previous declaration is here
const char inet_ntop(int, const void , char , socklen_t);
^
1 error generated.
make: ** [inet_ntop.o] Error 1解決辦法:
找到inet_ntop.c
文件把#include <arpa/inet.h>
這行註釋掉,再次執行上述命令,成功!接下來執行
cd ../intro make daytimetcpcli
最後執行編譯好的daytime文件
./daytimetcpcli 127.0.0.1
運行結果:
connect error: Connection refused
daytime服務被mac關閉了,所以顯示為refused,暫時還沒找到開啟的方法。。。
我們再換個服務器試試
./daytimetcpcli 64.113.32.5
這回成功返回時間!
57179 15-06-06 16:28:22 50 1 0 57.8 UTC(NIST) *
小夥伴們也可以試試其他地址,在這裏http://tf.nist.gov/tf-cgi/servers.cgi 可以找到各服務器地址
參考:
http://www.cppfans.org/1411.htmlhttp://blog.csdn.net/zjf280441589/article/details/18660697
現在試試理解各行代碼
./configure
它是一個腳本,用來在安裝前對系統進行檢查,確認系統是否具備了編譯軟件所需的各種條件。以C語言程序為例,configure腳本會確認系統內是否有編譯軟件所需的編譯器,以及所需的各種頭文件和庫等。
make
make是一個工具程序(Utility software),經由讀取叫做“makefile”的文件,自動化建構軟件。
程序的源碼裏有各種相互包含和連接,因此我們用一個被稱為makefile的文件告訴make源碼間的相互聯系和其它一些必需內容。makefile可以通過make命令的-f參數來指定。默認情況下,如果沒有具體指定,make命令會依次嘗試 一些默認文件名, 常見的有makefile和Makefile(推薦)等。
Makefile是怎麽來的
makefile是用configure腳本後自動生成的。源碼包內一般會有一個Makefile.in文件,它是生成makefile的模版。configure腳本會檢查你的系統,然後用收集到的信息結合Makefile.in模板來生成最終的makefile文件。
不過Makefile.in這個模板又是哪裏來的呢?是否所有的源碼編譯時都用同一套Makefile模板來生成makefile?前面提到的configure腳本呢?它又從哪裏來?每個源碼包內的configure都一樣嗎?
autotools自動打包工具
通過上面講的流程進行編譯的源碼都采用了一套叫做autotools的工具包來處理源碼管理中的一些繁瑣步驟。Autotools包含了autoscan, autoconf, automake等工具。
程序員完成了程序的源碼後,如果用autotools進行發布前的準備工作,首先會在項目的目錄下運行autoscan程序,它會檢查目錄下面的源碼後生成一個configure.scan文件(這是configure腳本的爺爺),然後我們需要對configure.scan進行一些手動的更改(像生成的makefile的文件名之類都可以在這一步更改),然後將其另存為configure.ac(這是configure腳本的爸爸)。如果項目不大,configure.ac文件可能都不會超過20行。最後,用到前文提到的autotools中的autoconf來把configure.ac轉換成最終的configure腳本(這是兒子)。
接下來講Makefile.in。前面已經講到,Makefile(這是兒子)往往會又長又復雜,需要用configure腳本結合Makefile.in(這是Makefile的爸爸)來自動生成。但事實上,Makefile.in這個模版也常常會又長又復雜,手寫的話也不是省心的事。所以我們會用autotools中的automake來生成Makefile.in,真正需要程序員手寫的是一個叫Makefile.am(這是Makefile的爺爺)的文件,這個文件裏用特定的語法指明了要生成什麽目標,由什麽源文件生成,要安裝到哪個目錄等。
概括一下make和automake之間關系:
make是一個工具程序(Utility software),經由讀取叫做“makefile”的文件,自動化建構軟件;
Automake是一種編程工具,可以產生供make程式使用的makefile。
最後就是將源碼打包準備發布了。autotools簡化了這項工作,只要運行如下命令,它就能把源碼和必要的configure, Makefile等打包成用於發布的軟件包了。
cc 與 make 的區別是什麽?
cc 是什麽
首先,如果討論範圍在Unix和Linux之間,那麽cc和gcc不是同一個東西。cc來自於Unix的c語言編譯器,是 c compiler 的縮寫。gcc來自Linux世界,是GNU compiler collection 的縮寫,註意這是一個編譯器集合,不僅僅是c或c++。
其次, 如果討論範圍僅限於Linux,我們可以認為它們是一樣的,在Linux下調用cc時,其實際上並不指向unix的cc編譯器,而是指向了gcc,也就是說cc是gcc的一個鏈接(快捷方式)
gcc is a compiler, make is a tool to help build programs.
在入門時直接通過 gcc 就能編譯,而現在要使用 make 進行構建。是因為文件多了,並且構建存在先後順序嗎?
參考
編譯軟件的流程(configure, make和autotools等之間的關系)
學習編譯並運行C代碼