1. 程式人生 > >【探索wireshark】 使用autoconf, automake等自動生成Makefile

【探索wireshark】 使用autoconf, automake等自動生成Makefile

     無論是在Linux還是在Unix環境中,make都是一個非常重要的編譯命令。不管是自己進行專案開發還是安裝應用軟體,我們都經常要用到make或 make install。利用make工具,我們可以將大型的開發專案分解成為多個更易於管理的模組,對於一個包括幾百個原始檔的應用程式,使用make和 makefile工具就可以輕而易舉的理順各個原始檔之間紛繁複雜的相互關係。

     但是如果通過查閱make的幫助文件來手工編寫Makefile,對任何程式設計師都是一場挑戰。幸而有GNU 提供的autoconf及automake這兩套工具使得編寫Makefile不再是一個難題。

     本文將介紹如何利用 GNU autoconf 及 automake 這兩套工具來協助我們自動產生 Makefile檔案,並且讓開發出來的軟體可以像大多數原始碼包那樣,只需"./configure", "make","make install" 就可以把程式安裝到系統中。

    首先,把ethereal-0.2.0原始碼解壓到一個目錄,並刪除其中已存在的和Makefile有關的檔案。然後依次執行以下命令:

1. autoscan

說明:autoscan命令來幫助我們根據目錄下的原始碼生成一個configure.in的模板檔案。

將生成的configure.scan修改為configure.in,
然後編譯configure.in,修改內容為:
----------------------------------------------------------------
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.65])
AC_INIT(ethereal.c)
AM_INIT_AUTOMAKE(ethereal, 0.2.0)
AC_CONFIG_SRCDIR([capture.h])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([fcntl.h netinet/in.h string.h strings.h sys/ioctl.h sys/socket.h sys/time.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T

# Checks for library functions.
AC_FUNC_MALLOC
AC_CHECK_FUNCS([socket strchr strrchr])

AC_OUTPUT(Makefile)

----------------------------------------------------------------

2. aclocal

說明:aclocal根據configure.in檔案的內容,自動生成aclocal.m4檔案。aclocal是一個perl 指令碼程式,它的定義是:“aclocal - create aclocal.m4 by scanning configure.ac”。

3. autoheader

說明:autoheader 用來產生模板標頭檔案,以便於後面生成的configure檔案的使用。

4. 執行autoconf

說明:autoconf是一個用於生成可以自動地配置軟體原始碼包,用以適應多種UNIX類系統的shell指令碼工具,其中autoconf需要用到 m4,便於生成指令碼。

5. 新建檔案Makefile.am,修改內容如下:

----------------------------------------------------------------
AUTOMAKE_OPTIONS = foreign
INCLUDES = `pkg-config --cflags gtk+-2.0 libgnomeui-2.0`
LIBS = `pkg-config --libs gtk+-2.0 libgnome-2.0`
bin_PROGRAMS = ethereal
ethereal_SOURCES= /
    capture.c    /
    ethereal.c   /
    file.c       /
    menu.c       /
    packet.c     /
    packet-arp.c /
    packet-ip.c  /
    packet-tcp.c /
    packet-udp.c /
    capture.h    /
    config.h     /
    ethereal.h   /
    etypes.h     /
    file.h       /
    menu.h       /
    packet.h
----------------------------------------------------------------

說明:

AUTOMAKE_OPTIONS :設定automake的選項。Automake主要是幫助開發GNU軟體的人員來維護軟體,所以在執行automake時,會檢查目錄下是否存在標準GNU軟體中應具備 的檔案,例如'NEWS'、'AUTHOR'、'ChangeLog'等檔案。設定foreign 時,automake會改用一般軟體的標準來檢查。
INCLUDES :程式中用到的標頭檔案,使用 pkg-config工具來自動配置
LIBS :程式中用到的庫檔案,使用 pkg-config工具來自動配置
bin_PROGRAMS :最終生成的可執行檔名稱,可以有多個可執行檔案,中間用空格隔開
ethereal_SOURCES :生成上個選項中列出的二進位制檔案所需的原始檔,每個檔案單獨列出

6. 執行automake --add-missing

說明:automake是一個從Makefile.am檔案自動生成Makefile.in的工具。為了生成Makefile.in,automake還需用到perl,由於automake建立的釋出完全遵循GNU標準,所以在建立中不需要perl。

7. 執行./configure

至此,已經自動生成了Makefile,如果原始碼沒有錯誤,就可以編譯了。
可以使用以下命令:
make :編譯
make install :安裝
make clean :清理臨時檔案
make dist :打包成標準的軟體包

相關推薦

探索wireshark 使用autoconf, automake自動生成Makefile

     無論是在Linux還是在Unix環境中,make都是一個非常重要的編譯命令。不管是自己進行專案開發還是安裝應用軟體,我們都經常要用到make或 make install。利用make工具,我們可以將大型的開發專案分解成為多個更易於管理的模組,對於一個包括幾百個

Python程式設計Pycharm如何設定自動換行

Pycharm如何設定自動換行 在寫這篇IDE文章之前我在網上找了幾個文件做了參考。 我按照以上圖中找到了相關的配置選項並勾選如下: 設定完成後我測試是否可以換行,如下: 並沒有發現可以換行,於是我重新打開了pycharm再次嘗試,神奇的事情發生了,它還是沒有自動換行,找

vue2.0解決使用vue-cli生成專案後項目地址自動新增#號的問題

使用vue官方的vue-cli腳手架自動生成專案後,在啟動專案後,會自動開啟 ‘http://localhost:8080/#/’ 地址,而且一直沒法去掉“#”號。直到後來重新詳細看vue-router

Spring註解——生命週期以及自動裝配

    本文主要講解一下配合spring註解講解spring中bean的生命週期和自動裝配涉及到一些註解,如有理解偏頗之處,懇請各位大神指正。容器管理bean的生命週期bean的生命週期     bea

提供原始碼下載使用Mybatis-Generator自動生成Dao、Model、Mapping相關檔案

其實這個沒什麼,但是能大大加快我們的開發速度。 只需要把一個配置檔案配置好就行, <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//my

今日頭條演算法工程師 ~ 你來投遞!

今日頭條社招今日頭條演算法工程師(這是社招哦) 職位描述 : 基於機器學習, 優化頭條新產品的排序, 提升使用者體驗 在這裡, 你有機會見證一個產品從0到1的過程, 在演算法,工程,產品上得到全方面的鍛鍊 基本要求 : 1. 熟悉常見演算法, 如LR, GBDT, DNN,

Maven學習(七)----基於Mybatis-Generator自動生成Dao、Model、Mapping檔案

基於Mybatis-Generator自動生成Dao、Model、Mapping檔案 準備工作: 安裝並配置好MyEclipes + Maven 1、配置Maven的pom.xml檔案 在pom.xml新增mybatis-generator外掛: <!-- my

AutoConf自動生成Makefile(基於helloworld簡單例子)

programs tom change col -a 二進制 自己 int 生成 新建一個簡單的helloworld工程文件夾,目錄結構如下 hello.h代碼: #include<stdio.h> void fprint() { printf("h

一個簡單的執行程序的GNU automake自動生成Makefile的方法及案例

rect -o 創建 otool 其中 ner markdown ted head 一個簡單的執行程序的GNU automake自動生成Makefile的方法及案例 在GNU的世界裏,存在Automake這樣的工具進行自動生成Makefile文件,automake是由Per

PE/vsVisual Studio自定義生成工具配置方法和相關vs系統變數含義

DATE: 2018.11.20 1、自定義生成工具配置方法 以x86純彙編編譯為例: x86純彙編的編譯需要yasm彙編器工具,在VC系統路徑下檢視當前系統中是否含有可用的yasm.exe: where yasm.exe 可以將yasm.exe放在C盤windo

laravel5.6 laravel中介軟體內生成引數並且傳遞到控制器的2種方法

中介軟體方法: /** * 自定義中介軟體: * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */

python sklearn包——混淆矩陣、分類報告自動生成

preface:做著最近的任務,對資料處理,做些簡單的提特徵,用機器學習演算法跑下程式得出結果,看看哪些特徵的組合較好,這一系列流程必然要用到很多函式,故將自己常用函式記錄上。應該說這些函式基本上都會用到,像是資料預處理,處理完了後特徵提取、降維、訓練預測、通過混淆矩陣看

B/SASP.NET---驗證碼-生成和切換

驗證碼是什麼? 驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分使用者是計算機還是人的公共全自動程式

intellij idea隱藏.iml和.idea自動生成檔案

情景是這樣子的:我從gitlab上拉取專案程式碼,用intellij idea開啟載入後自動生成了.iml、.idea格式的檔案,我又不想把它新增進現有專案的.ignore檔案中,每次提交前用sourc

automake自動生成makefile檔案

 Linux下程式設計時,為了方便編譯,往往使用Makefile檔案自動完成編譯,但是Makefile檔案本身的書寫十分複雜,規則很多。好在Linux為我們提供了自動生成功能完善的Makefile檔案的工具autoconf/automake。本文講述如何使用它們生成Make

一個簡單的執行程式的GNU automake自動生成Makefile的方法及案例

1、autoscan 2、修改生成的configure.scan為configure.in 3、aclocal 4、autoheader 5、autoconf 6、建立Makefile.am並進行具體內容的寫入 7、automake 8、automake 9、./configure生成Makefile

C++學習如何在Clion中生成多個可執行檔案

在構建一個新的Clion工程的時候,會自動生成一個資料夾cmake-build-debug,可以幫助我們快速的對整個C++工程進行編譯執行。而主函式編譯後生成的可執行檔案就位於cmake-build-d

spring註解@Component、@Service自動生成bean的命名規則

參考連結:資訊來源今天碰到一個問題,寫了一個@Service的bean,類名大致為:CUserxml配置:<context:component-scan base-package="com.xxx.xx.x"/>結果啟動報錯:No bean named 'cUse

Unity教程UGUI中如何動態生成精靈的幾種方法

本篇文章主要說sprite.Load()方法是如何新建精靈的 ---1.2D精靈物體的建立 這幾行程式碼是建立2D精靈的主要程式碼,這幾個程式碼都在start()函式中         //Transform EGO = Resources.Load("EmptyGO"