• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • automake 小回顧

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    現在google Makefile 和 automake就能找到一些文章。以一個Hello 程序描述為一個project生成Makefile的過程。 這個例子其實在 Info automake 里能看到。大家把它翻成中文的,不錯。 但實際上按照這個例子來做的話,步驟都對,就是太簡單,一些常用的設置需要

    現在google Makefile 和 automake就能找到一些文章。以一個Hello 程序描述為一個project生成Makefile的過程。

    這個例子其實在 Info automake 里能看到。大家把它翻成中文的,不錯。

    但實際上按照這個例子來做的話,步驟都對,就是太簡單,一些常用的設置需要寫進去,但是沒有提到,還是要自己info , google ,try .

    下面是我對Automake一個小總結。

    現在google Makefile 和 automake就能找到一些文章。以一個Hello 程序描述為一個project生成Makefile的過程。

    這個例子其實在 Info automake 里能看到。大家把它翻成中文的,不錯。

    但實際上按照這個例子來做的話,步驟都對,就是太簡單,一些常用的設置需要寫進去,但是沒有提到,還是要自己info , google ,try .

    下面是我對Automake一個小總結。

    1  步驟總述

       (1) autoscan 生成configure.scan .

       (2) 在configure.scan基礎上手動編輯,主要要添加的 :

             AM_INIT_AUTOMAKE(myprojectname , version)

             AC_OUTPUT( 最后要生成的Makefile , 包括 子目錄中的,中間用空格隔開) , 例如 AC_OUTPUT(Makefile  subdir/Makefile

    subdir1/Makefile)
     
      AC_PROG_RANLIB (意義見第四條末尾)

       (3) aclocal

            autoconf 

                       生成configure腳本。

       (4) 這步我基本靠手,呵呵,有沒有腳本來完成這個的?就是在每個最后需要生成Makefile的目錄中,寫一個Makefile.am .

            最上層的要寫明

            AUTOMAKE_OPTIONS = foreign
     
     如果這個目錄沒有要編譯的文件 ,只包含了子目錄,則只寫個

            SUBDIRS  = dir1   
     
     就ok了。
     例如我的工程,最上層只是包含了源碼目錄,于是就寫了
     AUTOMAKE_OPTIONS=foreign
     SUBDIRS=src
     

            如果有文件要編譯,則要指明target 先。比如我的src目錄底下既有文件,又有目錄,而src的這層目錄中的文件最后是要編譯成一個

    可執行文件,則src目錄下的Makefile.am這么寫。

     bin_PROGRAMS= myprogram
     SUBDIRS= sub1

      myprogram_SOURCES=
         a.cpp
       b.cpp
     # 要編譯的源文件。這兒的_SOURCES是關鍵字 
     EXTRA_DIST=
      a.h
      b.h
     # 不用編成.o,但生成target myprogram也需要給編譯器處理的頭文件放這里

            myprogram_LDADD = libsub1.a 這個_LDADD是關鍵字,
     # 最后生成myprogram這個執行文件,還要link src/sub1這個目錄中的內容編成的一個lib :libsub1.a,
     
     myprogram_LDFLAGS = -lpthread -lglib-2.0 -L/usr/bin $(all_libraries)
     # myprogram還要link系統中的動態so,以此類推,需要連自編譯的so,也寫到這個關鍵字 _LDFLAGS后面就好了。
      
     AM_CXXFLAGS = -D_LINUX
     # 傳遞給g++編譯器的一些編譯宏定義,選項,

     INCLUDES=-IPassport -Isub1/ -I/usr/include/glib-2.0
        -I/usr/lib/glib-2.0/include $(all_includes)
     #  傳遞給編譯器的頭文件路徑。


     下面是sub1種生成lib的Makefile.am

     noinst_LIBRARIES = libprotocol.a
     # 不是生成可執行文件,而是靜態庫,target用noinst_LIBRARIES
     libprotocol_a_SOURCES =
      alib.cpp
     EXTRA_DIST = mylib.h
       alib.h
     INCLUDES= -I../ $(all_includes)
     AM_CXXFLAGS = -D_LINUX -DONLY_EPOLL -D_SERVER
     

     ok ,最后補上AC_PROG_RANLIB涵義,如果要自己生成lib,然后link到最終的可執行文件中,則要加上這個宏,否則不用。

    2   一點討論
     每個目錄至少都要有一個target,或者是可執行文件或者是lib,似乎對目錄的劃分帶來點局限。
     比如我的目錄結構如果是這樣
     ./Src
     ./Src/sub1
     ./Src/sub2
     而我想這樣,sub1,sub2都沒有target,目錄劃分只是為了區別代碼的不同模塊,然后把兩個目錄中編譯出的中間文件一起link
     ,得到最后需要的 myprogram 。
     似乎在Src/Makefile.am中要這么寫
     myprogram_SOURCES = sub1/a.cpp
       sub2/b.cpp
     可以實現,但我沒試,:P

     當然和設成先編譯出libsub1.a libsub2.a 最后Link得到myprogram 沒有本質區別了。

    3    剩下的就是
         automake --add-missing
         Ok , Makefile.in應該放到各個目錄下了。


    最后,運行configure腳本,生成 各個目錄下的Makefile .......
    再最后 ,make .......

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>