1. 程式人生 > >學習編譯並運行C代碼

學習編譯並運行C代碼

usr 源碼管理 net 哪裏 爸爸 默認 .org 快捷 lan

以《UNIX網絡編程》中的代碼為例,學習如何編譯並運行C代碼。

根據 UNIX網絡編程(第3版)環境搭建——使用MAC OSX10.10,能夠成功運行

1、下載本書的頭文件及示例源碼
原書地址:http://www.unpbook.com/src.html

2、解壓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.html

http://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代碼