關于建構C++項目
上一篇文章《Linux下動态連結庫的建立和使用》中在建立連結庫的時候,我們也有簡單介紹了CMake的使用。那麼如果建構一個C++項目呢,當然我們可以手動去寫Makefile,或許你會認為那是一件有趣的事情,但是既然有工具可以代勞,我們也就沒那麼必要手動去寫Makefile。在大型項目中收寫Makefile,那是一件相當令人頭疼的事情。那麼有那些工具可以為我們代勞這件事呢,在CMake沒出現之前,我們可以使用Autotools, 也就是說個人比較推薦使用CMake, 理由就是CMake配置使用相對簡單一些。下面我們就介紹一下Autotools和CMake的差別。
Autotools和CMake的差別
Autotools是一個工具集具有強大的靈活性。Autotools包含五個指令 : aclocal、autoscan、autoconf、autoheader、automake。現在我們看一下他的步驟。
autotools詳細步驟如下:
我們再看看cmake的步驟:
- 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 檔案
另外至于配置檔案
- 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的用法說明:在實際應用中, Makefile.am的建立還是很複雜的,還要配置引用其他動态庫、第三方動态庫等關系, 在本中隻是一個簡單的demo, 有時間可以在研究一下他的詳細規則。
- 1、make: 用來編譯代碼
- 2、make clean 指令清除編譯時的obj檔案,它與 make 指令是對應關系,一個是編譯,一個清除編譯的檔案
- 3、make install 指令把目标檔案安裝到系統中
- 4、make uninstall 指令把目标檔案從系統中解除安裝。
- 5、make dist 指令将程式和相關的文檔打包為一個壓縮文檔以供釋出
Eclipse CDT + Autotools
1.首先安裝autotools plugins, 如果是使用的是最新版,則使用 http://download.eclipse.org/releases/mars
2.修改autotools plugins的配置, 如下圖:
3.建立工程,工程類型選擇,如下圖:
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