日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

大型项目使用Automake/Autoconf完成编译配置

發(fā)布時(shí)間:2023/12/10 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大型项目使用Automake/Autoconf完成编译配置 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用過(guò)開(kāi)源C/C++項(xiàng)目的同學(xué)們都知道,標(biāo)準(zhǔn)的編譯過(guò)程已經(jīng)變成了簡(jiǎn)單的三部曲:configure/make/make?install,?使用起來(lái)很方便,不像平時(shí)自己寫(xiě)代碼,要手寫(xiě)一堆復(fù)雜的Makefile,而且換個(gè)編譯環(huán)境,Makefile還需要修改(Eclipse也是這樣)。

?

這么好的東東當(dāng)然要拿來(lái)用了,但GNUAutotool系列博大精深,工具數(shù)量又多,涉及的語(yǔ)言也多,要是自己從頭看到尾,黃花菜都涼了,項(xiàng)目估計(jì)早就結(jié)束了;上網(wǎng)搜樣例倒是有一大堆,但都是“hello?world”的樣例,離真正完成大型項(xiàng)目的目標(biāo)還差得遠(yuǎn)。

?

沒(méi)有辦法,對(duì)照網(wǎng)上的樣例,再找?guī)讉€(gè)開(kāi)源的源碼,然后參考各種Autotools的手冊(cè),花了2天時(shí)間,終于完成了一個(gè)基本可用的Autotools。為了避免其他XDJM也浪費(fèi)時(shí)間,因此將過(guò)程總結(jié)下來(lái),就算是新年禮物,送給大家!!

?

提綱挈領(lǐng):使用Autotools其實(shí)很簡(jiǎn)單

大家不要看到那么多工具,其實(shí)使用起來(lái)很簡(jiǎn)單,總結(jié)起來(lái)就是兩部分:

1)?按照順序調(diào)用各個(gè)工具;

2)?修改或者添加3個(gè)文件;

整個(gè)操作順序如下圖:

?

?

聽(tīng)到我這么講,大家是否覺(jué)得有信心了?好的,下面我們來(lái)看具體如何操作:

1.?源碼根目錄調(diào)用autoscan腳本,生成configure.scan文件,然后將此文件重命名為configure.ac(configure.in,早期使用.in后綴)

2.?修改【configure.ac,利用autoconf提供的各種M4宏,配置項(xiàng)目需要的各種自動(dòng)化探測(cè)項(xiàng)目

3.?編寫(xiě)【自定義宏】,建議每個(gè)宏一個(gè)單獨(dú)的*.m4文件;

4.?調(diào)用aclocal收集configure.ac中用到的各種非Autoconf的宏,包括自定義宏;

5.?調(diào)用autoheader,掃描configure.ac(configure.in)、acconfig.h(如果存在),生成config.h.in宏定義文件,里面主要是根據(jù)configure.ac中某些特定宏(AC_DEFINE)生成的#define#undefine宏,configure在將根據(jù)實(shí)際的探測(cè)結(jié)果決定這些宏是否定義(具體見(jiàn)后面例子)。

6.?按照automake規(guī)定的規(guī)則和項(xiàng)目的目錄結(jié)構(gòu),編寫(xiě)一個(gè)或多個(gè)【Makefile.am(Makefile.am數(shù)目和存放位置和源碼目錄結(jié)構(gòu)相關(guān))Makefile.am主要寫(xiě)的就是編譯的目標(biāo)及其源碼組成。

7.?調(diào)用automake,將每個(gè)Makefile.am轉(zhuǎn)化成Makefile.in,同時(shí)生成滿足GNU編碼規(guī)范的一系列文件(帶-a選項(xiàng)自動(dòng)添加缺少的文件,但有幾個(gè)仍需要自己添加,在執(zhí)行automake前需執(zhí)行touch?NEWS?README?AUTHORS?ChangeLog)。如果configure.ac配置了使用libtool(定義了AC_PROG_LIBTOOL宏(老版本)或LT_INIT宏),需要在此步驟前先在項(xiàng)目根目錄執(zhí)行libtoolize?--automake?--copy?--force,以生成ltmain.sh,供automakeconfig.status調(diào)用。

8.?調(diào)用autoconf,利用M4解析configure.ac,生成shell腳本configure。以上幾步完成后,開(kāi)發(fā)者的工作就算完成了,后面的定制就由開(kāi)源軟件的用戶(hù)根據(jù)需要給configure輸入不同的參數(shù)來(lái)完成。

9.?用戶(hù)調(diào)用configure,生成Makefile,然后make?&&?make?install。

整個(gè)過(guò)程步驟有9步,但其中有6步你只需要簡(jiǎn)單的敲一個(gè)命令即可,只有剩下的三步需要你動(dòng)手寫(xiě)一些東西,對(duì)應(yīng)上面步驟中的藍(lán)色黑體字部分,而本文的重點(diǎn)就是如何在大型項(xiàng)目中完成這三歩。

?

步步為營(yíng):三步完成編譯配置

【第2步:修改configure.ac文件

從上面的步驟可以看到,使用autoscan工具掃描后就會(huì)生成一個(gè)簡(jiǎn)單的configure.ac文件,這已經(jīng)是一個(gè)完整的configure.ac文件框架了,但還不足以達(dá)到我們的要求,因此我們要在框架里面添加一些東西:

1.1?添加AM_INIT_AUTOMAKE宏

在AC_INIT?宏下一行添加AM_INIT_AUTOMAKE([foreign?-Wall?-Werror]),中括號(hào)里面的選項(xiàng)可以根據(jù)需要來(lái)修改,具體請(qǐng)看automake手冊(cè)關(guān)于這個(gè)宏的說(shuō)明。

1.2?如果需要,添加AC_CONFIG_HEADERS([config.h])宏

添加這個(gè)宏很簡(jiǎn)單,但關(guān)鍵是“如果需要”,什么情況下需要這個(gè)宏呢?

這個(gè)宏的目的是輸出config.h,這是一個(gè)C的頭文件,里面主要是包含很多宏定義#define,說(shuō)到這里其實(shí)就很明確了,輸出這個(gè)文件的目的就是提供各種相關(guān)的宏,而宏在代碼中的作用就是#ifdef,也就是說(shuō):如果你的代碼需要用到宏開(kāi)關(guān)進(jìn)行控制,那么就要輸出這個(gè)文件。具體的使用方法如下:

1)?首先確定代碼中需要使用什么宏來(lái)進(jìn)行開(kāi)關(guān)定制,確定宏的名稱(chēng),編寫(xiě)和宏相關(guān)的代碼,且要包含config.h的頭文件;

2)?在configure.ac中的各種處理(例如AC_CHECK_***AC_ARG_***)中使用AC_DEFINE宏定義C/C++的宏,名稱(chēng)和上面的相同;如果是使用AC_CHECK_HEADERS,會(huì)自動(dòng)添加宏定義;

3)?執(zhí)行完第7歩后,Autoconf就會(huì)自動(dòng)生成config?.h文件

1.3添加編譯鏈接需要的程序

編譯鏈接需要用到的程序需要添加在#?Checks?for?programs.注釋后面。對(duì)于C/C++來(lái)說(shuō),最常見(jiàn)的就是gcc,?g++,?靜態(tài)庫(kù)編譯、動(dòng)態(tài)庫(kù)編譯,對(duì)應(yīng)的選項(xiàng)如下:

AC_PROG_CXX

AC_PROG_CC

AC_PROG_RANLIB

如果使用libtool編譯,則選項(xiàng)如下,注意使用了libtool則需要將AC_PROG_RANLIB去掉

LT_INIT

1.4?configure.ac代碼中各個(gè)部分添加自己的檢測(cè)處理

這一步是我們的主要工作,需要根據(jù)自己的項(xiàng)目具體情況來(lái)編寫(xiě),常見(jiàn)操作對(duì)應(yīng)的宏和樣例請(qǐng)參考本文后面的“【常見(jiàn)操作對(duì)應(yīng)的宏】”:。至于具體添加在哪個(gè)地方,configure.ac中的注釋已經(jīng)清楚的告訴你了,例如:

#?Checks?for?libraries.

#?Checks?for?library?functions.

1.5?AC_OUTPUT上一行添加AC_CONFIG_FILES宏

添加這個(gè)宏的目的是制定Autoconf輸出哪些文件,常見(jiàn)的文件就是Makefile文件,config.hAC_CONFIG_HEADERS宏里面指定了,這里不需要再次指定。例如:

AC_CONFIG_FILES([Makefile?tools/Makefile?common/Makefile?worker/Makefile])

?

【第3步:編寫(xiě)自定義的Autoconf

Autoconf雖然提供了很多內(nèi)置的宏,但在實(shí)際項(xiàng)目中,這些宏不可能滿足所有的要求,有的處理還是要自己完成。雖然在configure.ac文件中可以直接編寫(xiě)各種處理代碼,但這樣做有幾個(gè)缺點(diǎn):

1)?很不美觀:打開(kāi)configure.ac文件,密密麻麻的一大段花花綠綠的Shell代碼,看著眼花繚亂;

2)?修改起來(lái)很麻煩:要找半天才能找到要修改的位置,一不小心就改錯(cuò)了;

就像寫(xiě)C/C++代碼要進(jìn)行封裝一樣,Autoconf的處理也需要進(jìn)行封裝,這個(gè)封裝就是自定宏,定義完成后在configure.ac中調(diào)用,看起來(lái)很清爽,修改也很簡(jiǎn)單。

下面我們來(lái)看如何自定義宏:

2.1?新建一個(gè)單獨(dú)的目錄,用于存放自定義宏,一般定義為m4

2.2?新建自定義宏文件

建議每個(gè)宏一個(gè)文件,文件必須以.m4結(jié)尾,文件名就是宏名(當(dāng)然如果你非要不這么做也可以,文件名隨便取)

2.3?編寫(xiě)Autoconf

具體的編寫(xiě)方式請(qǐng)參考Autoconf的手冊(cè)第10章節(jié),最好邊看手冊(cè)邊對(duì)照一個(gè)開(kāi)源軟件的樣例,這樣效果最好了。這里說(shuō)明幾個(gè)需要注意的地方:

1m4宏不是shell,請(qǐng)不要直接在文件中寫(xiě)shell代碼,而要在宏的各個(gè)部分里面寫(xiě)代碼;

最常見(jiàn)的就是if-else判斷,如果要在代碼中編寫(xiě)if-else判斷,需要使用AS_IF宏,或者在其它宏里面寫(xiě),例如AC_ARG_WITH,?AC_CACHE_CHECK;

2AC_DEFUN是定義autoconf的宏,AC_DEFINE是定義C/C++config?.h里面的宏,不要混淆了;

2.4?運(yùn)行aclocal工具,生成aclocal.m4

由于自定義宏是放在我們新建的目錄中的,configure.ac并沒(méi)有像C/C++那樣的include語(yǔ)句可用,因此也就找不到這些宏,這時(shí)就需要aclocal工具了:aclocal會(huì)將自定義宏編譯成configure.ac可用的宏,保存在和configure.ac同級(jí)目錄下的aclocal.m4文件中,這樣在configure.ac就能夠直接使用了。具體的編譯方法如下(m4就是你的目錄):

aclocal?-I?m4

同時(shí)需要在根目錄下的Makefile.am中添加ACLOCAL_AMFLAGS?=?-I?m4。

?

還有一種方法是將所有的自定義宏都放入到一個(gè)acinclude.m4文件中,不過(guò)不推薦這種方法,原因是因?yàn)檫@種方法的缺點(diǎn)和直接將所有自定義宏放入configure.ac中沒(méi)有多大差別。

【第6步:編寫(xiě)Makefile.am文件

對(duì)于大型項(xiàng)目來(lái)說(shuō),代碼一般都是分目錄存放的,而不會(huì)像Hello?world樣例那樣簡(jiǎn)單的就幾個(gè)文件,因此寫(xiě)Makefile.am就麻煩一些,但其實(shí)主要是工作量增加了,原則都是一樣的:

原則1:每個(gè)目錄一個(gè)Makefile.am文件;同時(shí)在configure.acAC_CONFIG_FILES宏中指定輸出所有的Makefile文件,例如:

AC_CONFIG_FILES([Makefile?tools/Makefile?common/Makefile?worker/Makefile])

原則2:父目錄需要包含子目錄

在父目錄下的Makefile.am中添加:?SUBDIRS?=?所有子目錄,例如SUBDIRS=test?tools

原則3Makefile.am中指明當(dāng)前目錄如何編譯

前兩個(gè)原則很簡(jiǎn)單,這里就不多說(shuō)了,重點(diǎn)說(shuō)一下如何編寫(xiě)Makefile.am。

?

編寫(xiě)Makefile.am主要是完成3件事情:編譯(make)、安裝(make?install)、打包(make?dist),下面我們一一來(lái)進(jìn)行講解。

3.1?編譯安裝

編譯和安裝的規(guī)則是綁定在一起的,通過(guò)同一條語(yǔ)句同時(shí)指定了編譯和安裝的處理方式,具體的格式為:安裝目錄_編譯類(lèi)型=編譯目標(biāo)

3.1.1【安裝目錄】

例如:bin_PROGRAMS?=?hello?subdir/goodbye,其中安裝目錄是bin,編譯類(lèi)型是PROGRAMS,編譯目標(biāo)是兩個(gè)程序hello,?goodbye.

常用缺省的安裝目錄如下

目錄

Makefile.am中的變量

使用方式

prefix

/usr/local

安裝目錄,通過(guò)--prefix指定

exec_prefix

${prefix}

同prefix

bindir

${exec_prefix}/bin

bin_編譯類(lèi)型

libdir

${exec_prefix}/lib

lib_編譯類(lèi)型

includedir

${prefix}/include

include_編譯類(lèi)型

noinstdir

無(wú)

noinst_編譯類(lèi)型,特殊的目錄,表示編譯目標(biāo)不安裝。

?

除了常用的缺省目錄外,有時(shí)候我們還需要自定義目錄,例如我們希望安裝完成后安裝目錄下有一個(gè)配置文件目錄config,同時(shí)將指定的test.ini拷貝到config目錄,則config目錄需要通過(guò)自定義目錄方式定義,然后按照缺省目錄的使用方式使用。例如:?

在根目錄下的Makefile.am中添加如下內(nèi)容:

configdir=${prefix}/config??=>?定義一個(gè)自定義的目錄名稱(chēng)config,注意dir后綴是固定的

config_DATA=config/test.ini??=>?使用自定義的目錄config,必須要有這句,否則目錄不會(huì)創(chuàng)建,?=號(hào)后面如果有對(duì)應(yīng)的文件,安裝時(shí)會(huì)將對(duì)應(yīng)的文件拷貝到config目錄下。

?

3.1.2【編譯類(lèi)型】

常見(jiàn)編譯類(lèi)型如下,沒(méi)有自定義編譯類(lèi)型

類(lèi)型

說(shuō)明

使用方式

PROGRAMS

可執(zhí)行程序

bin_PROGRAMS

LIBRARIES

庫(kù)文件

lib_LIBRARIES

LTLIBRARIES?(Libtool?libraries)

libtool庫(kù)文件

lib_LTLIBRARIES

HEADERS

頭文件

include_HEADERS

SCRIPTS

腳本文件,有可執(zhí)行權(quán)限

test_SCRIPTS(需要自定義test目錄)

DATA

數(shù)據(jù)文件,無(wú)可執(zhí)行權(quán)限

conf_DATA(需要自定義conf目錄)

?

3.1.3【編譯目標(biāo)】

編譯目標(biāo)其實(shí)就是編譯類(lèi)型對(duì)應(yīng)的具體文件,其中需要make生成的文件主要有如下幾個(gè):可執(zhí)行程序_PROGRAMS,普通庫(kù)文件_LIBRARIESlibtool庫(kù)文件_LTLIBRARIES,其它類(lèi)型對(duì)應(yīng)的編譯目標(biāo)不需要編譯,源文件就是目標(biāo)文件。

??標(biāo)準(zhǔn)的編譯配置

如果你熟悉gcc的編譯命令寫(xiě)法,那么AutomakeMakefile.am編譯過(guò)程就很好寫(xiě)了。因?yàn)?/span>Automake只是將寫(xiě)在一行gcc命令里的各個(gè)不同部分的信息分開(kāi)定義而已。我們來(lái)看具體是如何定義的:

_SOURCES:對(duì)應(yīng)gcc命令中的源代碼文件

_LIBADD:編譯鏈接庫(kù)時(shí)需要鏈接的其它庫(kù),對(duì)應(yīng)gcc命令中的*.a等文件

_LDADD:編譯鏈接程序時(shí)需要鏈接的其他庫(kù),對(duì)應(yīng)gcc命令中的*.a等文件

_LDFLAGS:鏈接選項(xiàng),對(duì)應(yīng)gcc命令中的-L,?-l,?-shared,?-fpic等選項(xiàng)

_LIBTOOLFLAGS:libtool編譯時(shí)的選項(xiàng)

**FLAGS(例如_CFLAGS/_CXXFLAGS)編譯選項(xiàng),對(duì)應(yīng)gcc命令中的-O2,?-g,?-I等選項(xiàng)

舉例如下:

#不同的編譯類(lèi)型只是第一句不一樣,后面的編譯配置都是一樣的

bin_PROGRAMS=?myproject

myproject_SOURCES?=?main.c

myproject_LDADD???=?./utils/libutils.a?./module1/libmodule1.a?./core1/libcore.a

myproject_LDFLAGS?=?-L/home/test/local?-lmemcached

myproject_CFLAGS??=?-I./core1/?-I./module1/?-I./utils/?-O2?-g

?

??如何編譯可執(zhí)行程序

對(duì)于大型項(xiàng)目來(lái)說(shuō),代碼基本上都是分目錄存放的,如果是直接寫(xiě)makefile文件,一般都是將所有源文件首先編譯成*.o的文件,再鏈接成最終的二進(jìn)制文件。但在Automake里面這樣是行不通的,因?yàn)槟阒灰屑?xì)看編譯類(lèi)型表格就會(huì)發(fā)現(xiàn),并沒(méi)有一種編譯類(lèi)型能夠編譯*.o文件,無(wú)法像常規(guī)makefile那樣來(lái)編寫(xiě),所以就需要采取一些技巧。

其實(shí)這個(gè)技巧也很簡(jiǎn)單:將非main函數(shù)所在目錄的文件編譯成靜態(tài)鏈接庫(kù),然后采用鏈接靜態(tài)庫(kù)的方式編譯可執(zhí)行程序。

樣例如下:

=================根目錄Makefile.am======================

#對(duì)應(yīng)Makefile.am原則2

SUBDIRS?=?tools?common?worker

?

=================tool目錄Makefile.am======================

#只是為了編譯而生成的.a庫(kù)文件,沒(méi)有必要安裝,?所以是noinst

noinst_LIBRARIES=libtools.a?

libtools_a_SOURCES=./urlcode.h?\

???????????????????./stringtools.cpp?\

???????????????????./stringtools.h?\

???????????????????./urlcode.c

?

===============common目錄Makefile.am======================

#只是為了編譯而生成的.a庫(kù)文件,沒(méi)有必要安裝,?所以是noinst

noinst_LIBRARIES=libcommon.a

libcommon_a_SOURCES=./iniparser.c?\

????????????????????(省略很多文件,?實(shí)際使用時(shí)要一一填寫(xiě))

????????????????????./exception.h?\

?

==============worker目錄Makefile.am============================

bin_PROGRAMS=worker

worker_SOURCES=./workeralgorithm.cpp?\

????????????????./worker.cpp?\

????????????????(省略很多文件,?實(shí)際使用時(shí)要一一填寫(xiě))

???????????????./worker.h

#通過(guò)_LDADD告訴Automake需要鏈接哪些庫(kù)

worker_LDADD=../tools/libtools.a?../common/libcommon.a

?

??如何編譯靜態(tài)庫(kù)

Automake天然支持編譯靜態(tài)庫(kù),只需要將編譯類(lèi)型指定為_LIBRARIES即可。

?

??如何編譯動(dòng)態(tài)庫(kù)

需要注意的是:_LIBRARIES只支持靜態(tài)庫(kù)(即*.a文件),而不支持編譯動(dòng)態(tài)庫(kù)(*.so)文件,要編譯動(dòng)態(tài)鏈接庫(kù),需要使用_PROGRAMS。除此之外,還需要采用自定義目錄的方式避開(kāi)Automake的兩個(gè)隱含的限制:

1)?如果使用bin_PROGRAMS,?則庫(kù)文件會(huì)安裝到bin目錄下,這個(gè)不符合我們對(duì)動(dòng)態(tài)庫(kù)的要求;

2)?automake不允許用lib_?PROGRAMS

下面假設(shè)將utils編譯成so,采用自定義目錄的方式,修改Makefile.am如下:

mylibdir=$libdir?????????#$libdir其實(shí)就是lib目錄,請(qǐng)參考【安裝目錄】表格

mylib_PROGRAMS=?libutils.so

libutils_so_SOURCES?=?utils.c?utils.h

libutils_so_LDFLAGS?=?-shared?–fpic??#這個(gè)就是gcc編譯動(dòng)態(tài)庫(kù)的選項(xiàng)

?

??如何編譯libtool庫(kù)

對(duì)于跨平臺(tái)可移植的庫(kù)來(lái)說(shuō),推薦使用libtool編譯,而且Automake內(nèi)置了libtool的支持,只需要將編譯類(lèi)型修改為_LTLIBRARIES即可。

需要注意的是:如果要使用libtool編譯,需要在configure.ac中添加LT_INIT宏,同時(shí)注釋掉AC_PROG_RANLIB,因?yàn)槭褂昧?/span>LT_INIT后,AC_PROG_RANLIB就沒(méi)有作用了。

?

3.2?打包

Automake缺省情況下會(huì)自動(dòng)打包,自動(dòng)打包包含如下內(nèi)容:

1)?所有源文件

2)?所有Makefile.am/Makefile.in文件

3)?configure讀取的文件

4)?Makefile.am’s?(using?include)?和configure.ac’?(using?m4_include)包含的文件

5)?缺省的文件,例如README,?ChangeLog,?NEWS,?AUTHORS

?

如果除了這些缺省的文件外,你還想將其它文件打包(一般包括靜態(tài)庫(kù)、頭文件、配置文件、幫助文件),有如下兩種方法:

(1)?粗粒度方式:通過(guò)EXTRA_DIST來(lái)指定,指定文件就打包文件,指定目錄就打包目錄,例如:

EXTRA_DIST=conf/config.ini??test??tools/initialize.sh

如果test是目錄,那么會(huì)將test目錄下所有的文件和目錄都打包。

(2)?細(xì)粒度方式:在“安裝目錄_編譯類(lèi)型=編譯目標(biāo)”前添加dist(表示需要打包),?或者nodist(不需要打包),例如:

#data_DATA=?distribute-this打包

dist_data_DATA?=?distribute-this

?

#foo_?SOURCES不打包

bin_PROGRAMS?=?foo

nodist_foo_SOURCES?=?do-not-distribute.c

?

【后記】

GNU?Autotool工具博大精深,我也是結(jié)合項(xiàng)目的實(shí)際應(yīng)用來(lái)使用的,并沒(méi)有完整的研究所有的工具,因此難免存在瑕疵和紕漏,如果大家發(fā)現(xiàn)有疑問(wèn)或者問(wèn)題的地方,歡迎大家指正。當(dāng)然,GNU自己的手冊(cè)是最權(quán)威的,如果你有疑問(wèn)的話,參考手冊(cè),以手冊(cè)為準(zhǔn)。

?

如果想了解autotools的工作原理和流程以及更高級(jí)的技巧,請(qǐng)參考胡華強(qiáng)寫(xiě)的《autoconf?and?automake介紹與典型應(yīng)用.doc》。

?

【常見(jiàn)操作對(duì)應(yīng)的宏】

1./configure添加--with-package參數(shù),例如:./configure??--with-libmemcached

AC_ARG_WITH,具體如何寫(xiě)請(qǐng)參考autoconf手冊(cè)15.2章節(jié),里面給了一個(gè)完整的樣例。

2./configure添加?–enable-feature參數(shù),例如:./configure?–enable-multithread

AC_ARG_ENABLE,顧名思義,這個(gè)宏的意思就是打開(kāi)開(kāi)關(guān),這個(gè)開(kāi)關(guān)可以是編譯開(kāi)關(guān),也可以是代碼功能開(kāi)關(guān),如果是編譯開(kāi)關(guān),則要配合AM_CONDITIONAL宏來(lái)使用(樣例請(qǐng)看automake手冊(cè)20.1章節(jié)的AM_CONDITIONAL宏說(shuō)明);如果是代碼功能開(kāi)關(guān),則要配合AC_DEFINE宏來(lái)使用(請(qǐng)參考autoconf手冊(cè)15.2章節(jié)的AC_ARG_WITH宏的樣例)

3./configure的時(shí)候檢查頭文件

AC_CHECK_HEADER:?檢查一個(gè)頭文件

AC_CHECK_HEADERS:檢查一批頭文件

4./configure時(shí)檢查庫(kù)文件

AC_CHECK_LIB:樣例請(qǐng)參考autoconf手冊(cè)15.2章節(jié)的AC_ARG_WITH宏的樣例

5修改make行為

如果你想修改默認(rèn)的make行為,可以先使用AC_ARG_WITH或者AC_ARG_ENABLE添加./configure參數(shù),再結(jié)合如下兩個(gè)宏來(lái)完成:

AM_CONDITIONAL:在./configure.ac中增加一個(gè)automake宏,在Makefile.am中使用if-else-endif來(lái)使用宏;

AC_SUBST:在./configure.ac中直接修改automake的變量,例如AM_CXXFLAGSAM_CFLAGS等編譯鏈接。

?

【參考資料】

1. 入門(mén)材料:http://sources.redhat.com/autobook/autobook/autobook_toc.html?。

2. autoconf手冊(cè):http://www.gnu.org/software/autoconf/manual/autoconf.html?。

3. automake手冊(cè):http://sources.redhat.com/automake/automake.html?。

4. libtool手冊(cè):http://www.gnu.org/software/libtool/manual/libtool.html?

5. tutorialhttp://www.lrde.epita.fr/~adl/dl/autotools.pdf?。

分類(lèi):?C

總結(jié)

以上是生活随笔為你收集整理的大型项目使用Automake/Autoconf完成编译配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。