使用autoconf生成Makefile并編譯工程的步驟
前言
在Linux下,編譯和鏈接需要用Makefile,而寫好一個(gè)Makefile可不容易,寫出一個(gè)規(guī)范的Makefile更是麻煩。我們可以利用autoconf來(lái)生成一個(gè)Makefile,尤其在大型工程里,能省去很多麻煩。
這里我會(huì)用一個(gè)工程來(lái)說(shuō)明怎么做,有一些步驟不是必須的,但是如果你看不出來(lái)哪些步驟不是必須的,最好跟著一步步走,因?yàn)槟承┎襟E省略了,代碼也需要做出相應(yīng)修改(如修改路徑等)。
步驟
首先安裝autoconf
sudo apt-get install autoconf
新建一個(gè)項(xiàng)目文件夾(例如:joy)
mkdir joy
cd joy
在里面新建兩個(gè)文件夾 lib 和 src ,用于放工程的庫(kù)文件和源文件。
mkdir lib
mkdir src
如下圖所示:
進(jìn)入lib文件夾,新建一個(gè)頭文件,如:haha.h,隨便聲明個(gè)函數(shù)吧。
cd lib
gedit haha.h
//haha.h #include <stdio.h> void printhaha();
進(jìn)入src文件夾,新建一個(gè)C文件,如:haha.c,實(shí)現(xiàn)頭文件的函數(shù);新建一個(gè)C文件,如:main_code.c,編寫主函數(shù)。
cd ../src
gedit haha.c
//haha.c #include "../lib/haha.h" void printhaha() { printf("haha\n"); }
//main_code.c #include "../lib/haha.h" void main() { printhaha(); }
回到j(luò)oy文件夾下,我們的工程文件都已經(jīng)寫好了
cd ..
運(yùn)行autoscan生成configure.scan
autoscan
編輯configure.scan
gedit configure.scan
編輯之前的文件是這樣的
#編輯之前的原始文件 # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([src/haha.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT
前綴AC指的是 AutoConf
AC_PREREQ不用管
AC_INIT里面填【包名】【版本】【BUG提交地址 也就是你的郵箱】
AC_CONFIG_SRCDIR里填源文件路徑下的任意一個(gè)文件名,autoconf通過(guò)檢測(cè)這個(gè)文件是否存在,判斷這個(gè)路徑是否正確,一般不用管
AC_CONFIG_HEADERS不用管
插入下面這句,automake階段需要,否則會(huì)報(bào)錯(cuò)
AM_INIT_AUTOMAKE
前綴AM指的是 AutoMake
最后的AC_OUTPUT,改為AC_OUTPUT(Makefile)
修改完之后的文件如下所示:
#修改后的文件 # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT(hhh, 1.0, idontknow@666.com) AC_CONFIG_SRCDIR([src/haha.c]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile)
保存,并將configure.scan重命名為configure.ac
新建Makefile.am
gedit Makefile.am
輸入以下代碼
AUTOMAKE_OPTIONS= \ foreign \ subdir-objects bin_PROGRAMS=test_prj test_prj_SOURCES= \ lib/haha.h \ src/haha.c \ src/main_code.c
AUTOMAKE_OPTIONS后面是automake的執(zhí)行選項(xiàng),用空格隔開(kāi);
foreign指的是只檢測(cè)必須的文件;
subdir-objects指的是編譯生成的.o文件可以放在子路徑(跟源文件放一起),沒(méi)有這個(gè)選項(xiàng)的話,所有.o文件都會(huì)放在工程根目錄下;
bin_PROGRAMS 后面的名字是 生成的可執(zhí)行二進(jìn)制文件名
可以有多個(gè) bin_PROGRAMS ,但每個(gè) bin_PROGRAMS 都需要有相對(duì)應(yīng)的 xxx_SOURCES ;
xxx_SOURCES 是 可執(zhí)行文件xxx的依賴項(xiàng),包括頭文件,源文件等
用aclocal生成aclocal.m4文件
aclocal
用autoconf生成configure文件
autoconf
用autoheader生成config.h.in
autoheader
用automake生成Makefile.in,需要加上 –add-missing使其自動(dòng)加上缺省文件
automake --add-missing
然后我們這個(gè)軟件就做好了,可以整個(gè)包拿去上傳github或者開(kāi)源論壇了。
別人下載了我們的源碼包之后怎么編譯鏈接可執(zhí)行文件呢?或者說(shuō)我們?cè)趺淳幾g鏈接我們的可執(zhí)行文件呢?
以下是源碼安裝的一般步驟,也是我們編譯鏈接的步驟
首先生成Makefile
./configure
然后make
make
現(xiàn)在我們可以看見(jiàn),可執(zhí)行文件 test_prj 已經(jīng)被生成出來(lái)了
運(yùn)行一下,結(jié)果如下:
結(jié)果是正確的。
進(jìn)入src目錄下,我們發(fā)現(xiàn)多了兩個(gè)文件
這就是AUTOMAKE_OPTIONS里subdir-objects的作用,少了這句話,這兩個(gè).o文件就會(huì)出現(xiàn)在你的根目錄下。如果很不幸你的工程比較大,有同名文件的話,那就可能出現(xiàn)很嚴(yán)重的后果了,所以這句話建議加上。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- C++關(guān)于Makefile的詳解含通用模板
- Makefile/cmake/node-gyp中區(qū)分判斷不同平臺(tái)的方法
- Python使用paramiko操作linux的方法講解
- Linux兩臺(tái)服務(wù)器之間傳輸文件和文件夾操作步驟
- Linux中文件/文件夾無(wú)法刪除的解決方案
- linux查找當(dāng)前python解釋器的位置方法
- Linux shell數(shù)組與關(guān)聯(lián)數(shù)組的用法實(shí)例
- Android之在linux終端執(zhí)行shell腳本直接打印當(dāng)前運(yùn)行app的日志的實(shí)現(xiàn)方法
- pyqt遠(yuǎn)程批量執(zhí)行Linux命令程序的方法
- Linux shell環(huán)境下Zabbix Api的使用
相關(guān)文章
Linux CentOS 6.5 卸載、tar安裝MySQL的教程
這篇文章主要介紹了Linux CentOS 6.5 卸載、tar安裝MySQL的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-11-11linux中的分號(hào)&&和&,|和||說(shuō)明與用法
在用linux命令時(shí)候,我們可以一行執(zhí)行多條命令或者有條件的執(zhí)行下一條命令,下面我們講解一下linux命令分號(hào)&&和&,|和||的用法2018-03-03解決centos7安裝nginx后無(wú)conf.d目錄或conf.d目錄下無(wú)default.conf文件問(wèn)題
這篇文章主要介紹了解決centos7安裝nginx后無(wú)conf.d目錄或conf.d目錄下無(wú)default.conf文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Linux CentOS 6.5 ifconfig查詢不到ip的解決方法
這篇文章主要介紹了Linux CentOS 6.5 ifconfig查詢不到ip的解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Ubuntu 安裝Eclipse 菜單無(wú)法使用解決辦法
這篇文章主要介紹了Ubuntu 安裝Eclipse 菜單無(wú)法使用解決辦法的相關(guān)資料,需要的朋友可以參考下2017-03-03Apache Spark 2.0 在作業(yè)完成時(shí)卻花費(fèi)很長(zhǎng)時(shí)間結(jié)束
大家在使用 Apache Spark 2.x 的時(shí)候可能會(huì)遇到這種現(xiàn)象:雖然我們的 Spark Jobs 已經(jīng)全部完成了,但是我們的程序卻還在執(zhí)行。怎么回事呢?下面小編通過(guò)實(shí)例代碼給大家介紹下2019-06-06linux讓程序開(kāi)機(jī)自動(dòng)運(yùn)行最簡(jiǎn)單的方法
在本篇文章里小編給大家整理的是一篇關(guān)于linux讓程序開(kāi)機(jī)自動(dòng)運(yùn)行最簡(jiǎn)單的方法以及相關(guān)代碼,需要的朋友們學(xué)習(xí)下。2019-11-11