[2013/07/14 更新:把linker 引用libraries的順序寫得更清楚一些。]
身為常常用Linux的程式設計師兼MIS人員來說,在Linux系統上面要編譯程式是很家常便飯的事情。
最常用的指令是./configure; make; make install ,筆者稱之為「大三元」。
只是如果今天角色互換,變成我們來開發程式,並且把程式以開放原始碼的方式發送出去,該怎麼做呢?
其實上述說的大三元指令,是由GNU Build System提供的aclocal, autoconf, automake幫你產生configure script file以及對應的Makefile。
由於筆者做專案需要引用curl這個library。
石頭閒言閒語部落格提供教學雖然基本,但是又不太夠用。以下便筆記一下自己在做該專案的方式,稱不上專業,若有謬誤,敬請多多包涵。
以下分為四個步驟來解說。
一、 先前準備工作
1. 今假設你的專案名稱為project。程式碼資料夾為src。
而且我們寫了一份程式碼,放在src/add.cpp底下。
2. 先準備四個文件:AUTHORS、ChangeLog、NEWS、README
(1) AUTHORS:寫明作者資訊。
(2) ChangeLog:程式碼異動記錄。
(3) NEWS:最新消息
(4) README:軟體說明與介紹
其它像是INSTALL(軟體安裝文件)以及COPYING(版權聲明),automake時,便會幫我們自動產生。
注意!如果你用的是舊版的Linux系統(例如筆者的CentOS 5),COPYING是用GPL v2,如果是新的Linux系統,COPYING是用GPL v3。
3. 建立doc資料夾。
二、撰寫configure.ac
在產生configure之前,我們必須先準備configure.ac這個檔案。我們將檔案撰寫如下:
三、撰寫對應的Makefile.am
由於我們習慣直接在專案目錄下輸入make。其實仔細去看各個開放原始碼專案,不難發現它們都在專案資料夾底下,放置Makefile。然後再透過該Makefile撰寫的規則,進入src底下各個程式資料夾的Makefile,進行make工作。
因此,為了達成這個目的,我們也需要在專案資料夾與src資料夾各放置一個Makefile。
但是,先前提到,我們會利用automake工具達成自動產生Makefile的工作。
而此工具需要撰寫Makefile.am檔案。所以,我們在這邊就另外寫Makefile.am檔案。
1. 專案資料夾底下的Makefile.am寫法:
2. src資料夾底下的Makefile.am寫法:
請注意,由於我們要用的curl函式庫編譯參數,根據linker order這篇教學指出,gcc library引用原則:「要用到某個library的程式檔,請放在要引用的library前面(舉例來說,libcurl.so會用到libz.so,則必須寫成-lcurl -lz)」。然而,網路上有些教學會跟我們說設定LIBS跟Add_LDFLAGS都一樣,這個在本例子使用automake是嚴重錯誤的!根據我們會自動產出的Makefile,其中一行可能長成這樣子:
$(CXXLINK) $(Add_LDFLAGS) $(Add_OBJECTS) $(Add_LDADD) $(LIBS)
如果我們把上面的src/Makefile.am改寫如下:
Add_LDFLAGS = -L/usr/local/lib -lcurlpp -lcurl -lstdc++ -L/usr/lib -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lkrb5support -lpthread -lkeyutils -lcom_err -lidn -l ssl -lcrypto -lz -lconfig++
那麼,根據gcc library引用順序原則,-L/usr/local/lib ... 這些指令會放在你的程式碼前面,進而造成make時會有編譯錯誤的問題。
四、產生configure檔案
在進行前三步驟後,我們已經產生了AUTHORS, ChangeLogs, NEWS, README, Makefile.am, src/Makefil.am文件;建立doc資料夾等工作。接著,輸入以下指令來產生configure script:
1. aclocal:產生aclocal.m4 , autom4e.cache。以定義autoconf常用的巨集。
2. autoconf:用來產生configure、config.status文件。
3. automake --add-missing:產生Makefile.in,自動加入某些預設內容如Copy Right等。
根據以上四個步驟,我們已經做出configure script了。接著我們就可以執行configure產生Makefile,以及make編譯程式碼了。
參考資料
- Hello Autoconf, the GNU Build System
- Autoconf額外檢查函式庫
- Using C/C++ libraries with Automake and Autoconf
- Using Autotools
- GNU: Autoconf
- HowTo Autotools - Distributing source code with autoconf and automake
- Initializing configure
- aclocal
- Generated Output Files
- An Introduction to GCC - for the GNU compilers gcc and g++: Link order of libraries
Hi there!
回覆刪除We are the firm who are creating the wordpress theme.These theme are also available in premium wordpress theme
To buy the wordpress theme contact Us
http://avenaz.com/wordpress/themes.html