Automakeツールの使用

3915 ワード

最近linuxでC++プログラムを書くことが多く、以前linuxで小さなプログラムを書くときは自分でmakefileを手書きで書くのが一般的でしたが、今はこれを書くのがファイルや依存度が多い場合には使いにくいことに気づき、時間の無駄もあります.そしてautomakeというツールが使いやすいと聞いて、持ってきて使います.確かに使いやすいです.まず簡単な構成と使用方法を書きます.
まずインストールします.私のはubuntuシステムです.直接2つのコマンドで終わります.
sudo apt-get install autoconf 
sudo apt-get install libtool
インストールが完了すると使用できます.automakeの使用は簡単です.makefileを生成するには、makefileを生成するフォルダとコンパイルするソースファイルを指定するだけでいいです.
方法を言う前に、このツールの大まかな動作原理を話しましょう.これはMakefileを再帰的に生成するツールです.これはMakefileのコマンドの実行と似ています.最上位から生成され、依存していることを発見してから次のレベルに再帰的に探しています.
具体的な方法についてお話しします.
Automakeの使用では、configureという構成が必要なファイルが2つあります.acまたはconfigure.inどちらの名前をつけてもいいです.もう一つはmakefileです.am、以下にそれぞれ説明します.
例えば、私のプロジェクトには次の2つのソースフォルダがあります.test 1とtest 2、それぞれにcppファイルがあります.test 1.cpp test2.cppでは、まずエンジニアリングの最上位ディレクトリに2つのファイルを作成します.1つはconfigureです.もう一つはMakefile.am、サブフォルダごとにMakefileを作成します.amファイルは、以下に示すように、ソースフォルダが1つしかない場合は、すべてのコードの階層でこの2つのファイルを直接作成することができます.
 lsk@lsk-VirtualBox:~/automake_test$ ls configure.ac  Makefile.am  test1  test2 lsk@lsk-VirtualBox:~/automake_test/test1$ ls Makefile.am  test1.cpp
lsk@lsk-VirtualBox:~/automake_test/test2$ ls Makefile.am  test2.cpp automakeを初めて使用する場合は、autoscanというコマンドを使用してフォルダの下のファイルをスキャンしてconfigureを生成することができます.scan、その後名前を変更するなどaclocalなどのコマンドを行いますが、全く必要ないと思います.書いたconfigureを直接コピーすることができます.acとmakefile.amは自分の工事に入れて、それから自分の工事に従って修正してこのように効率がもっと高くて、次は私の方法を言います.
次は私のconfigureです.acとMakefile.amファイル内容:
configure.ac
#                                               -*- Autoconf -*-
  2 # Process this file with autoconf to produce a configure script.
  3 
  4 AC_PREREQ([2.69])
  5 AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
  6 AM_INIT_AUTOMAKE(test,1.0) #  test             
  7 AC_CONFIG_SRCDIR([test1],[test2]) #         ,          [./],             ,     ,      
  8 AC_CONFIG_HEADERS([config.h]) #       ,    
  9 
 10 # Checks for programs.
 11 AC_PROG_CXX
 12 AC_PROG_CC
 13 
 14 # Checks for libraries.
 15 AC_CHECK_LIB([jrtp],[x264]) #              ,            
 16 # Checks for header files.
 17 AC_CHECK_HEADERS([malloc.h memory.h stdint.h stdlib.h string.h])
 18 
 19 # Checks for typedefs, structures, and compiler characteristics.
 20 AC_CHECK_HEADER_STDBOOL
 21 AC_TYPE_UINT16_T
 22 AC_TYPE_UINT32_T
 23 AC_TYPE_UINT64_T
 24 AC_TYPE_UINT8_T
 25 
 26 # Checks for library functions.
 27 AC_CHECK_FUNCS([memset strchr strtol])
 28 AC_CONFIG_FILES([
 29     test1/Makefile #       makefile   ,     test1  test2   ,         。
 30     test2/Makefile
 31 ])
 32 AC_OUTPUT          

Makefile.am
これはtest 1の下のmakefileです.am、最上位フォルダは実行可能プログラムを生成する必要がないので、下のファイルの最初の文だけでいいです.
test 2はtest 1に倣って書けばOKです.
  1 AUTOMAKE_OPTIONS = foreign
  2 bin_PROGRAMS = test1  #                 
  3 test1_SOURCES = test1.cpp #                 ,   
  4 test1_LDADD=-ljrtp -lx264 #       ,                 ,   configure.ac          

この2つのファイルを作成したら、コマンドを直接使用します.
Autoreconf-isvはconfigureファイルを直接生成することができ、aclocal、autoconfなどのコマンドを実行する必要はありません.ここで、isvの3つのパラメータはそれぞれ:
i欠落したアシストファイルを自動的にインストールし、設定しないとmissingファイルが欠落していることを示す
s欠落したファイルに対して、コピーではなくソフトチェーンを確立する
v実行時の全ての情報を印刷する
このコマンドの詳細については、公式ドキュメントを参照してください.http://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/autoreconf-Invocation.html
これによりconfigureファイルが生成され、コマンドが実行されます.
./configure
そしてmakeは実行可能ファイルを生成します
私のtest 1.cppとtest 2.cppファイルの内容はそれぞれ:
  1 #include
  2 using namespace std;
  3 int main(){
  4     cout<
  1 #include
  2 using namespace std;
  3 
  4 void printInfo(){
  5     cout<<__file__ int="" main="" cout="" world=""/>

test 1フォルダに入り、make
そして./test1
出力:
lsk@lsk-VirtualBox:~/automake_test/test1$ ./test1  hello world 1
正常に実行されました.