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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Makefile文件生成

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Makefile文件生成 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Makefile文件生成

(2008-04-28 19:19:01) 轉載▼
標簽:

linux

分類:DoxygenMakefile

所必須的軟件:autoconf(generate configuration script [configuration])
automake(? aclocal:automatically generateaclocal.m4 from configure.in)
m4??????perl????????libtool(其中libtool非必須)。

autoconf是一個用于生成可以自動地配置軟件源碼包,用以適應多種UNIX類系統的shell腳本工具,其中autoconf需要用到m4,便于生成腳本。automake是一個從Makefile.am文件自動生成Makefile.in的工具為了生成Makefile.in,automake還需用到perl,由于automake創建的發布完全遵循GNU標準,所以在創建中不需要perl。libtool是一款方便生成各種程序庫的工具。

生成Makefile的操作過程如下

1) 運行autoscan命令

2) 將configure.scan 文件重命名為configure.in,并修改configure.in文件

$sudo mv configure.scan configure.in

3)在project目錄下新建Makefile.am文件,并在core和shell目錄下也新建makefile.am文件

4) 在project目錄下新建NEWS、 README、 ChangeLog 、AUTHORS文件

5) 將/usr/share/automake-1.10/目錄下的depcomp和complie文件拷貝到本目錄下

6) 運行aclocal命令(configure.in-->aclocal.m4)

7) 運行autoconf命令 (configure.in+aclocal.m4 -->configuration)

8) 運行automake -a命令(Makefile.am+configuration.in-->Makefile.in)

9) 運行./confiugre腳本

生成Makefile流程圖





從上圖中可以看出,對于用戶而言,其中最主要的就是編寫configuratio.in和Makefile.am文件,首先我們來看configuration.in文件 每個configure.scan文件都是以AC_INIT開頭,以AC_OUTPUT結束。我們不難從文件中看出confiugre.in文件的一般布局為: 測試程序(checkfor programs),測試庫(libraries),測試頭文件(headerfile),測試類型定義(typedef),測試結構(constructure),測試編譯器特性(compilercharacters),測試庫函數(libraries functions);修改后的結果如下:
# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.61)#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)AC_INIT(test, 1.0, haizi007418@sina.com)AC_CONFIG_SRCDIR([src/ModuleA/apple/core/test.c])AM_CONFIG_HEADER(config.h)# AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)AM_INIT_AUTOMAKE(test,1.0)# Checks for programs.AC_PROG_CC# Checks for libraries.# FIXME: Replace `main' with a function in `-lpthread':AC_CHECK_LIB([pthread], [pthread_rwlock_init])AC_PROG_RANLIB #Multithread# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.# 在AC_OUTPUT輸入 要創建的Makefile文件名AC_OUTPUT([Makefilesrc/lib/Makefilesrc/ModuleA/apple/core/Makefilesrc/ModuleA/apple/shell/Makefile])
其中要將AC_CONFIG_HEADER([config.h])修改為:AM_CONFIG_HEADER(config.h),并加入AM_INIT_AUTOMAKE(test,1.0);

?
最后,我們來看看Makefile.am文件,它是一種比Makefile更高層次的規則。 只需指定要生成什么目標,它由什么源文件生成,要安裝到什么目錄等構成。表一列出了可執行文件、靜態庫、頭文件和數據文件,四種書寫Makefile.am文件個一般格式。
表 1Makefile.am一般格式

對于可執行文件和靜態庫類型,如果只想編譯,不想安裝到系統中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。

表 2Makefile.am中可用的全局變量


在Makefile.am中盡量使用相對路徑,系統預定義了兩個基本路徑

表3Makefile.am中可用的路徑變量


在上文中我們提到過安裝路徑,automake設置了默認的安裝路徑:

1) 標準安裝路徑

默認安裝路徑為:$(prefix) = /usr/local,可以通過./configure--prefix=<new_path>的方法來覆蓋。

其它的預定義目錄還包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib,datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。

2) 定義一個新的安裝路徑

比如test, 可定義testdir = $(prefix)/test, 然后test_DATA =test1test2,則test1,test2會作為數據文件安裝到$(prefix)/ /test目錄下。

我們首先需要在工程頂層目錄下創建一個Makefile.am來指明包含的子目錄,由于每個源文件都會用到相同的頭文件,所以我們在最頂層的Makefile.am中包含了編譯源文件時所用到的頭文件,并導出。

SUBDIRS=src/lib src/ModuleA/apple/shell src/ModuleA/apple/core CURRENTPATH=$(shell /bin/pwd)INCLUDES=-I$(CURRENTPATH)/src/include -I$(CURRENTPATH)/src/ModuleA/apple/include export INCLUDES
我們將lib目錄下的swap.c文件編譯成libswap.a文件(只想編譯,而并不想安裝), 被apple/shell/apple.c文件調用,那么lib目錄下的Makefile.am如下所示:
noinst_LIBRARIES=libswap.alibswap_a_SOURCES=swap.cINCLUDES=-I$(top_srcdir)/src/includ
如果想安裝,那么庫將會安裝到$(prefix)/lib目錄下,可執行文件將會安裝到${prefix}/bin,則Makefile.am如下:
bin_LIBRARIES=libswap.alibswap_a_SOURCES=swap.cINCLUDES=-I$(top_srcdir)/src/include# 將swap.h安裝到${prefix}/include /swap目錄下swapincludedir=$(includedir)/swapswapinclude_HEADERS=$(top_srcdir)/src/include/swap.h
接下來,對于可執行文件類型的情況,我們將討論如何寫Makefile.am?對于編譯apple/core目錄下的文件,我們寫成的Makefile.am如下所示:
noinst_PROGRAMS=testtest_SOURCES=test.c # test.c文件在鏈接時,需要apple.o和 libswap.a文件test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a # Linux下的信號量/讀寫鎖文件進行編譯,需要在編譯選項中指明- D_GNU_SOURCEtest_LDFLAGS=-D_GNU_SOURCE# test_LDFLAGS只是鏈接時的選項,編譯時同樣需要指明該選項,所以需要 DEFS來指明編譯選項# DEFS已經有初始值,所以這里用+=的形式指明。DEFS+=-D_GNU_SOURCE# 如果你的程序還包含其他的庫,除了用AC_CHECK_LIB宏來指明外,還可以用LIBS來指明#LIBS=-lpthread
終結
? 對于一個已有configure.in and Makefile.am的源程序包,我們只需要通過執行下述命令來生成Makefile文件: aclocal ,autoconf,automake,./configure 就可以生成Makefile文件,然后sudo make就開始編譯源程序(編譯時error),最后sudo? make install安裝。運行。。。。。。(可能有運行時error)!

總結

以上是生活随笔為你收集整理的Makefile文件生成的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。