當前位置:編程學習大全網 - 源碼下載 - 如何自動生成makefile>

如何自動生成makefile>

自動生成makefile流程

如圖所示為automake,autoconf生成makefile的過程(簡化)。

為壹個項目源文件生成makefile並make的步驟如下:

操作在包含源文件的項目目錄下進行。

(1). 運行autoscan,生成文件configure.scan。

(2). 修改configure.scan,改名為configure.in。

(3).運行autoheader,生成文件configure.h.in(現在壹般改為configure.ac)。configure.in裏有宏AC_CONFIG_HEADER()時用。

(4).運行libtoolize,生成壹些支持文件,ltmain.sh。需要用libtool生成***享庫用。

(5).運行allocal,生成aclocal.m4。

(6). 運行autoconf,生成configure。

(7).為源文件編寫makefie.am,每壹個包含源文件的目錄和子目錄都有壹個makefile.am。

(8).運行automake,生成makefile.in,每個包含makefile.am的子目錄都生成makefile.in。

automake -a選項可以補齊文件config.guess,config.sub,install-sh,missing,depcomp。

(9).運行./configure,生成config.status,config.h,makefile。

(10).運行make,生成中間文件對象文件,庫文件,最後生成可執行文件。

(11).運行make install,相應的可執行文件,庫文件,頭文件拷貝到系統相應位置。

自動生成makefile例子

這個例子***有三個C文件,main.c,add/add.c和sub/sub.c。源代碼如下:

/*main.c*/

#include

int main(void)

{

printf("%d\n",add(sub(100,5),1));

return 0;

}

/* add/add.c */

int add(int x,int y)

{

return x+y;

}

/* sub/sub.c */

int sub(int x,int y)

{

return x-y;

}

這個例子中add.c和sub.c被編譯成動態連接庫,然後main.c與這兩個庫連接生成可執行文件。

1.手動輸入configure.in和makefile.am

Q:自動生成makefile需要手動輸入什麽文件,作用是什麽?

按照上面的步驟執行,需要手動輸入的文件只有兩類configure.in和makefile.am。

(1).手動修改configure.in

autoscan運行後configure.scan文件為(系統不壹樣可能略有會不同)

# -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.63])

AC_INIT([FULL-PACKAGE-NAME],[VERSION],[BUG-REPORT-ADDRESS])

AC_CONFIG_SRCDIR([main.c])

AC_CONFIG_HEADERS([config.h])

# Checks for programs.

AC_PROG_CC

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

手動修改為configure.in:

# -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.63])

AC_INIT(hellobb,1.0,[])

AM_INIT_AUTOMAKE(hellobb,1.0)

AC_CONFIG_SRCDIR([main.c])

AC_CONFIG_HEADERS([config.h])

# Checks for programs.

AC_PROG_CC

AC_PROG_LIBTOOL

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT(Makefile add/Makefile sub/Makefile)

其中宏AC_INIT和AC_OUTPUT是必需的,AC_INIT放在開頭,AC_OUTPUT放在結尾。

AC_INIT:說明軟件包的名字,版本等。

AC_OUTPUT:說明生成的shell腳本文件configure運行後輸出的文件。

AM_INIT_AUTOMAKE:用automake需要的宏。

AC_PROG_CC:決定要使用的C編譯器。如果環境變量CC沒有值,檢查gcc和cc,別的C編譯器。設置變量CC的值為找到的編譯器名稱。

AC_PROG_LIBTOOL:檢查LIBTOOL。

AC_CONFIG_SRCDIR([main.c]):./configure檢查在給它的目錄裏是否有main.c文件。

AC_CONFIG_HEADER([config.h]):./configure從config.h.in中生成config.h文件,config.h文件是包含了很多#define宏的c頭文件。當編譯文件的時候,用壹個宏-DHAVE_CONFIG_H代替原來需要用-Dmacro傳遞的所有預處理宏集合。

例如屏蔽掉這句#AC_CONFIG_HEADER([config.h]),make時編譯main.c的命令是

gcc -DPACKAGE_NAME=\"hellobb\" -DPACKAGE_TARNAME=\"hellobb\" -DPACKAGE-VERSION=\"1.0\" -DPACKAGE_STRING=\"hellobb\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"hellobb\" -DVERSION=\"1.0\" -DSTDC_HEADERS=1 _DHAVE_SYS_TYPES_H=1 -DHAVE_UNISTDLIB_H=1 -DHAVE_STING_H=1 -DHAVE_MEMORY_H=1 -dHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\"./libs/\" -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.c main.c

如果啟用AC_CONFIG_HEADER([config.h]),make時編譯main.c的命令是

gcc -DHAVE_CONFIG_H -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c

上面那些宏-Dmacro都包含在config.h裏了,我們只需要給編譯器傳遞-DHAVE_CONFIG_H就行了。

  • 上一篇:有沒有關於好的Android設計模式方面的書籍推薦?主要是設計應用的、
  • 下一篇:動力學的三大基本公式是什麽?
  • copyright 2024編程學習大全網