天天看點

使用Autotools建構C++項目

關于建構C++項目

上一篇文章《Linux下動态連結庫的建立和使用》中在建立連結庫的時候,我們也有簡單介紹了CMake的使用。那麼如果建構一個C++項目呢,當然我們可以手動去寫Makefile,或許你會認為那是一件有趣的事情,但是既然有工具可以代勞,我們也就沒那麼必要手動去寫Makefile。在大型項目中收寫Makefile,那是一件相當令人頭疼的事情。那麼有那些工具可以為我們代勞這件事呢,在CMake沒出現之前,我們可以使用Autotools, 也就是說個人比較推薦使用CMake, 理由就是CMake配置使用相對簡單一些。下面我們就介紹一下Autotools和CMake的差別。

Autotools和CMake的差別

Autotools是一個工具集具有強大的靈活性。Autotools包含五個指令 : aclocal、autoscan、autoconf、autoheader、automake。現在我們看一下他的步驟。

autotools詳細步驟如下:

  • 1、運作autoscan指令
  • 2、将configure.scan 檔案重命名為
  • 3、适當修改configure.sc 檔案
  • 4、運作aclocal指令,掃描 configure.ac 檔案生成 aclocal.m4檔案
  • 5、運作autoconf指令, 生成configure 檔案
  • 6、運作autoheader指令, 生成config.h.in檔案
  • 7、手工建立Makefile.am檔案, 并添加相關内容
  • 8、手動建立NEWS、 README、 AUTHORS、ChangeLog檔案,運作automake –add-missing指令, 生成 Makefile.in 檔案
  • 9、運作./confiugre腳本, 生成Makefile 檔案
我們再看看cmake的步驟:
  • 1、編寫CMakeLists.txt, 内容格式可以參考《Linux下動态連結庫的建立和使用》一文的示例
  • 2、運作cmake指令
另外至于配置檔案
  • autoconfig的配置檔案configure.ac我們通過autosan生成,我們隻需要修改就可以、autoconfig的配置檔案Makefile.am我們需要自己手工從頭編寫;
  • cmake的配置檔案CMakeLists.txt需要手工編寫,當然cmake提供了gui的配置工具供大家使用;
重點看一下兩者配置檔案的内容吧,因為這是我們實際使用的關鍵步驟:
- autotools cmake
變量定義 name=… set(name, “…”)
環境檢測

AC_INIT

測試程式

AC_PROG_CC

測試函數庫

AC_CHECK_LIB([pthread], [pthread_rwlock_init])

AC_PROG_RANLIB

測試頭檔案

測試類型定義

測試結構

測試編譯器特性

測試庫函數

測試系統調用

AC_OUTPUT

find_library(lib libname pathllist)

find_package(packename)

find_path(var name pathlist)

find_program(var name pathlist)

子目錄 SUBDIRS= add_subdirectory(list)
可執行檔案

bin_PROGRAMS=binname

binname_SOURCES=

binname_LDADD=

binname_CFLAGS=

binname_LDFLAGS=

add_executable(binname ${sources})

target_link_libraries(binname librarylist)

靜/動态庫

lib_LIBRARIES=libname.a/libname.so

libname_SOURCES=

add_library(libname static/shared ${source} )
頭檔案

INCLUDES=

include_HEADES=或CFLAGS=-I

include_directories(list)
源碼搜尋 aux_source_directories(. list)
依賴庫

LIBS=

LDADD=

target_link_libraries(binname librarylist))
标志

CFLAGS=

LDFLAGS=

set(CMAKE_C_FLAGS …)
libtool

AC_PROG_LIBTOOL

lib_LTLIBRARIES=name.la name_la_SOURCES=

安裝設定 install(TARGETS targets..[…])
其他檔案 EXTRA_DIST

install(FILES files.. )

install(DIRECTORY dirs..)

條件語句

if()

endif

if() else() endif() while() endwhile()
執行外部指令 exec_program(commd )
子子產品 include()
資訊輸出 messge(STATUS “messge”)
項目 project(name)

Autotools的使用

假設有一個test項目, test目錄下有maic.cpp , include/test.h, lib/test.cpp 。

main.cpp代碼:

#include <stdio.h>
#include "include/test.h"
int main(){
    test_method();
}
           

test.h代碼:

void test_method(); 
           

test.cpp代碼:

#include <stdio.h>  
#include "../include/test.h"  
void test_method()  {  
    printf("hello world!/n");  
}  
           

然後我們根據上文所說的九個步驟,看一下autotools在linux環境下的使用。

  • 1、進入test目錄,運作autoscan指令,在test目錄下生成 configure.scan 檔案
  • 2、将configure.scan 檔案重命名為configure.sc

    cat configure.ac 我們看一下該檔案的内容:

#                                               -*- Autoconf -*-  
# Process this file with autoconf to produce a configure script.  
AC_PREREQ()  
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)  
AC_CONFIG_SRCDIR([main.cpp])  
AC_CONFIG_HEADER([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  
           
  • 3、 對 configure.ac 檔案做适當的修改,修改顯示如下
#                                               -*- Autoconf -*-  
# Process this file with autoconf to produce a configure script.  
AC_PREREQ()  
#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)  
AC_INIT(hello,,[email protected])  
AM_INIT_AUTOMAKE(hello,)  
AC_CONFIG_SRCDIR([main.cpp])  
AC_CONFIG_HEADER([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_CONFIG_FILES([Makefile])  
AC_OUTPUT  
           

說明:

(1)以“#”号開始的行均為注釋行。

(2)AC_PREREQ 宏聲明本文要求的 autoconf 版本, 如本例中的版本 2.59。

(3)AC_INIT 宏用來定義軟體的名稱、版本等資訊、作者的E-mail等。

(4)AM_INIT_AUTOMAKE是通過手動添加的, 它是automake所必備的宏, FULL-PACKAGE-NAME是軟體名稱,VERSION是軟體版本号。

(5)AC_CONFIG_SCRDIR 宏用來偵測所指定的源碼檔案是否存在, 來确定源碼目錄的有效性.。此處為目前目錄下main.cpp。

(6)AC_CONFIG_HEADER 宏用于生成config.h檔案,以便 autoheader 指令使用。

(7)AC_PROG_CC用來指定編譯器,如果不指定,預設gcc。

(8)AC_OUTPUT 用來設定 configure 所要産生的檔案,如果是makefile,configure 會把它檢查出來的結果帶入makefile.in檔案産生合适的makefile。使用 Automake 時,還需要一些其他的參數,這些額外的宏用aclocal工具産生。

(9)AC_CONFIG_FILES宏用于生成相應的Makefile檔案。

  • 4、使用 aclocal 指令,掃描 configure.ac 檔案生成 aclocal.m4檔案, 該檔案主要處理本地的宏定義,它根據已經安裝的宏、使用者定義宏和 acinclude.m4 檔案中的宏将 configure.ac 檔案需要的宏集中定義到檔案 aclocal.m4 中
[[email protected] test]# aclocal  
[[email protected] test]# ls  
aclocal.m4  autom4te.cache  autoscan.log  configure.in  include  lib  main.cpp  
           
  • 5、使用 autoconf 指令生成 configure 檔案。這個指令将 configure.ac 檔案中的宏展開,生成 configure 腳本。這個過程可能要用到aclocal.m4中定義的宏。
[[email protected] test]# autoconf 
[[email protected] test]# ls  
aclocal.m4  autom4te.cache  autoscan.log  configure  configure.in  include  lib  main.cpp  
           
  • 6、 使用 autoheader 指令生成 config.h.in 檔案。該指令通常會從 “acconfig.h” 檔案中複制使用者附加的符号定義。該例子中沒有附加的符号定義, 是以不需要建立 “acconfig.h” 檔案
[[email protected] test]# autoconf 
[[email protected] test]# ls  
aclocal.m4  autom4te.cache  autoscan.log  config.h.in configure  configure.in  include  lib  main.cpp  
           
  • 7、手工建立Makefile.am檔案。Automake工具會根據 configure.in 中的參量把 Makefile.am 轉換成 Makefile.in 檔案。其内容:
UTOMAKE_OPTIONS = foreign  
bin_PROGRAMS = hello  
hello_SOURCES = main.cpp include/test.h lib/test.cpp  
           

說明:

(1)其中的AUTOMAKE_OPTIONS為設定automake的選項. 由于GNU對自己釋出的軟體有嚴格的規範, 比如必須附帶許可證聲明檔案COPYING等,否則automake執行時會報錯. automake提供了3中軟體等級:foreign, gnu和gnits, 供使用者選擇。預設級别是gnu. 在本例中, 使用了foreign等級, 它隻檢測必須的檔案。

(2)bin_PROGRAMS定義要産生的執行檔案名. 如果要産生多個執行檔案, 每個檔案名用空格隔開。

(3)hello_SOURCES 定義”hello”這個可執行程式所需的原始檔案。如果”hello”這個程式是由多個源檔案所産生的, 則必須把它所用到的所有源檔案都列出來,并用空格隔開。如果要定義多個可執行程式,那麼需要對每個可執行程式建立對應的file_SOURCES。

  • 8、手動建立NEWS、 README、 AUTHORS、ChangeLog檔案,再使用 Automake 指令生成 Makefile.in 檔案。使用選項 “–add-missing” 可以讓 Automake 自動添加一些必需的腳本檔案。
[root@localhost test]# touch NEWS  
[root@localhost test]# touch README  
[root@localhost test]# touch AUTHORS  
[root@localhost test]# touch ChangeLog  
[root@localhost test]# automake --add-missing  
           
  • 9、運作./confiugre腳本
Makefile的用法說明:
  • 1、make: 用來編譯代碼
  • 2、make clean 指令清除編譯時的obj檔案,它與 make 指令是對應關系,一個是編譯,一個清除編譯的檔案
  • 3、make install 指令把目标檔案安裝到系統中
  • 4、make uninstall 指令把目标檔案從系統中解除安裝。
  • 5、make dist 指令将程式和相關的文檔打包為一個壓縮文檔以供釋出
在實際應用中, Makefile.am的建立還是很複雜的,還要配置引用其他動态庫、第三方動态庫等關系, 在本中隻是一個簡單的demo, 有時間可以在研究一下他的詳細規則。

Eclipse CDT + Autotools

1.首先安裝autotools plugins, 如果是使用的是最新版,則使用 http://download.eclipse.org/releases/mars

使用Autotools建構C++項目

2.修改autotools plugins的配置, 如下圖:

使用Autotools建構C++項目

3.建立工程,工程類型選擇,如下圖:

使用Autotools建構C++項目

4、eclipse會調用autoscan/aclocal/ automake/autoconf自動建立一些列檔案。

5、修改 configure.ac

AC_PREREQ()  
    AC_INIT(auto, )  


    AC_CANONICAL_SYSTEM  
    AM_INIT_AUTOMAKE()  

    AC_PROG_CC  

    AC_CONFIG_FILES(Makefile                 
        src/Makefile   
        src/container/Makefile   
        src/config/Makefile)  

    AC_OUTPUT  
           

6、修改各級目下的Makefile.am, 執行 automake指令。

7、 最後執行./configure過程中,會将Makefile.in生成各層最終的Makefile

繼續閱讀