• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Networking /C++/Linux

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              11 Posts :: 14 Stories :: 1 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(4)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            用automake建立共享庫(動(dòng)態(tài)鏈接庫)Makefile

            要使用automake工具包建立一個(gè)交叉編譯的共享庫的Makefile

            這里用的autoconf是2.67版本,在debian下實(shí)現(xiàn):

            如果版本低,可以用apt-get install automake來裝最新的版本,還需要libtool,也需要用apt-get install來安裝。

            這里建立一個(gè)簡單的函數(shù)庫來介紹:

            建立目錄rx,及源碼目錄src:

            $mkdir rx
            $mkdir rx/src

            在rx/src下編輯rx.c,rx.h兩個(gè)源文件:

            mybdebian:/home/myb/php/rx/src# cat rx.h
            #ifndef __RX_H_
            #define __RX_H_
            int fun
            ();
            #endif
            mybdebian:
            /home/myb/php/rx/src# cat rx.c
            #include "rx.h"
            int fun
            ()
            {
            return 1234;
            }

            在rx目錄和rx/src目錄下分別建立Makefile.am文件

            rx目錄下的Makefile.am為頂層Makefile.am文件,只要包含其存放源碼的子目錄即可,內(nèi)容如下:

            AUTOMAKE_OPTIONS=foreign
            SUBDIRS
            =src

            rx/src目錄下的Makefile.am內(nèi)容如下:

            AUTOMAKE_OPTIONS=foreign
            lib_LTLIBRARIES
            =librx.la
            librx_la_SOURCES
            =rx.c
            include_HEADERS=rx.h

            其中l(wèi)ib_LTLIBRARIES=后面的“librx.la”為要生成的庫文件名,必須寫成.la,不能是.so,實(shí)際會(huì)生成librx.so文件。

            下面的librx_la是librx.la把“.”換成下劃線“_”后面加上“_SOURCES=”,等號(hào)以后為源文件名稱,多于一個(gè)時(shí)用空格隔開。

            include_HEADERS=后面的為頭文件,是供其它程序包含用的,make install時(shí)會(huì)復(fù)制到安裝目錄的include 目錄中。

            回到上層目錄,使用autoscan掃描源碼目錄:

            $autoscan
            $ls
            autoscan.log configure.scan Makefile.am src

            把configure.scan改名成為configure.ac

            $mv configure.scan configure.ac
            AC_OUTPUT([Makefile
            src
            /Makefile])

            編譯這個(gè)文件:

            $vim configure.ac
            # -*- Autoconf -*-
            #
            Process this file with autoconf to produce a configure script.

            AC_PREREQ([
            2.67])
            AC_INIT([FULL
            -PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
            AC_CONFIG_SRCDIR([src
            /rx.c])
            AC_CONFIG_HEADERS([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
            src
            /Makefile])
            AC_OUTPUT

            修改AC_INIT一句,即把包的全名、版本號(hào)及BUG報(bào)告email地址添上,如:

            AC_INIT(rx2dlib,0.01,resound@163.com)

            在它后面加一句:

            AM_INIT_AUTOMAKE

            這句話是必須的。

            由于這個(gè)腳本是用于生成共享庫的,所以要加一句AC_PROG_LIBTOOL在AC_PROG_CC的下一行:

            # Checks for programs.
            AC_PROG_CC
            AC_PROG_LIBTOOL

            修改后面的那個(gè)AC_CONFIG_FILES語句,改成AC_OUTPUT,并把后面的一條AC_OUTPUT去掉:

            AC_OUTPUT([Makefile
            src
            /Makefile])

            這樣,configure.ac就建好了,修改后的內(nèi)容如下:

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

            AC_PREREQ([
            2.67])
            AC_INIT(rx2dlib,
            0.01,resound@163.com)
            AM_INIT_AUTOMAKE

            AC_CONFIG_SRCDIR([src
            /rx.c])
            AC_CONFIG_HEADERS([config.h])

            # Checks for programs.
            AC_PROG_CC
            AC_PROG_LIBTOOL

            # Checks for libraries.

            # Checks for header files.

            # Checks for typedefs, structures, and compiler characteristics.

            # Checks for library functions.

            AC_OUTPUT([Makefile
            src
            /Makefile])

            然后按順序執(zhí)行:

            $aclocal
            $autoconf
            $autoheader
            $libtoolize --automake
            $automake –-add-missing
            configure
            .ac:13: installing `./config.guess'
            configure
            .ac:13: installing `./config.sub'
            configure
            .ac:6: installing `./install-sh'
            configure
            .ac:6: installing `./missing'
            src
            /Makefile.am: installing `./depcomp'

            這時(shí)configure腳本已經(jīng)生成了。

            可以用它來配置生成Makefile了。

            如我們要生成交叉編譯給ARM CPU使用的共享庫,這里假設(shè)我們要使用的編譯器為arm-none-linux-gnueabi-gcc,并且我們最終在ARM板上執(zhí)行時(shí),要把庫安裝到目標(biāo)板的/usr/local/armrx2d目錄中去??梢赃@樣配置:

            $./configure --host=arm-none-linux-gnueabi --prefix=/usr/local/armrx2d

            $make


            Make完成后可以到src目錄下面的一個(gè)隱藏目錄.libs目錄中看到生成的庫文件:

            mybdebian:/home/myb/php/rx/src/.libs# ls -l
            總計(jì)
            20
            -rw-r--r--
            1 root root 2368 04-19 22:48 librx.a
            lrwxrwxrwx
            1 root root 11 04-19 22:48 librx.la -> ../librx.la
            -rw-r--r--
            1 root root 930 04-19 22:48 librx.lai
            lrwxrwxrwx
            1 root root 14 04-19 22:48 librx.so -> librx.so.0.0.0
            lrwxrwxrwx
            1 root root 14 04-19 22:48 librx.so.0 -> librx.so.0.0.0
            -rwxr-xr-x
            1 root root 5422 04-19 22:48 librx.so.0.0.0
            -rw-r--r--
            1 root root 2228 04-19 22:48 rx.o

            我們?cè)倩氐巾攲幽夸?,?zhí)行make install可以自動(dòng)安裝生成的庫到/usr/local/armrx2d/lib目錄下。

            若使用automake時(shí)出現(xiàn)下面錯(cuò)誤信息

            required file `./ltmain.sh' not found

            是因?yàn)閘ibtool未配置:

            解決辦法:

            $libtoolize --automake --debug --copy –force

            或:

            $libtoolize --automake

            #
            #
            # 利用libtool自動(dòng)生成動(dòng)態(tài)庫
            #
            1. autoscan命令在當(dāng)前目錄生成configure.scan文件, 內(nèi)容為:
            # -*- Autoconf -*-
            # Process this file with autoconf to produce a configure script.
            AC_PREREQ(2.57)
            AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
            AC_CONFIG_SRCDIR([src/bot.h])
            AC_CONFIG_HEADER([config.h])
            # Checks for programs.
            AC_PROG_CXX
            AC_PROG_CC
            # Checks for libraries.
            # Checks for header files.
            AC_HEADER_STDC
            AC_CHECK_HEADERS([limits.h malloc.h stdlib.h string.h unistd.h])
            # Checks for typedefs, structures, and compiler characteristics.
            AC_HEADER_STDBOOL
            AC_C_CONST
            AC_C_INLINE
            # Checks for library functions.
            AC_FUNC_MALLOC
            AC_FUNC_REALLOC
            AC_CHECK_FUNCS([memset strcasecmp strchr strdup])
            AC_OUTPUT
            將其該名為configure.ac 然后修改:
            configure.ac 文件是 autoconf 的輸入文件,經(jīng)過 autoconf 處理,展開里面的 m4宏,
            輸出的是 configure 腳本。
            第 4 行聲明本文件要求的 autoconf 版本,因?yàn)楸纠褂昧诵掳姹?2.57,所以在此注明。
            第 5 行 AC_INIT 宏用來定義軟件的名稱和版本等信息
            AC_INIT([test], 1.0, [email]linhanzu@gmail.com[/email])
            增加版本信息(為生成lib庫做準(zhǔn)備)
            lt_major=1
            lt_age=1
            lt_revision=12
            dist_version=0.1.12
            AM_INIT_AUTOMAKE(test, $dist_version) //自動(dòng)生成Makefile文件
            增加宏, 打開共享庫
            AC_PROG_LIBTOOL
            # Check for dl  
            DL_PRESENT=""
            AC_CHECK_LIB( dl, dlopen, DL_PRESENT="yes",, $DL_LIBS -ldl )
            if test "x$DL_PRESENT" = "xyes"; then
            AC_DEFINE(HAVE_LIBDL, 1, [Define if DL lib is present])
            DL_LIBS="-ldl"
            AC_SUBST(DL_LIBS)
            fi
            # Check for libm
            M_PRESENT=""
            AC_CHECK_LIB( m, sin, M_PRESENT="yes",, $M_LIBS -lm )
            if test "x$M_PRESENT" = "xyes"; then
            AC_DEFINE(HAVE_LIBM, 1, [Define if libm is present])
            M_LIBS="-lm"
            AC_SUBST(M_LIBS)
            fi
            增加依賴庫,這里就僅僅列舉了pthread庫,生成的Makefile會(huì)自動(dòng)加上-pthread
            # Check for pthread
            PTHREAD_PRESENT=""
            AC_CHECK_LIB( pthread, pthread_create, PTHREAD_PRESENT="yes",, $PTHREAD_LIBS
            -lpthread )
            if test "x$PTHREAD_PRESENT" = "xyes"; then
            AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if libpthread is present])
            PTHREAD_LIBS="-lpthread"
            AC_SUBST(PTHREAD_LIBS)
            fi
            要生成項(xiàng)目工程目錄和其它目錄下的Makefile 文件, 必需加入
            AM_CONFIG_FILES的宏:
            例如: AC_CONFIG_FILES([Makefile
                                 src/Makefile
                                 data/Makefile
                                 docs/Makefile])
            修改完后Makefile.ac如下:
            # -*- Autoconf -*-
            # Process this file with autoconf to produce a configure script.
            AC_PREREQ(2.57)
            AC_INIT([test],[1.0],[[email]arne_caspari@users.sourceforge.net[/email]])
            AM_CONFIG_HEADER(config.h)
            lt_major=1
            lt_age=1
            lt_revision=12
            dist_version=0.1.12
            AM_INIT_AUTOMAKE(test, $dist_version)
            AC_SUBST(lt_major)
            AC_SUBST(lt_revision)
            AC_SUBST(lt_age)
            # Checks for programs.
            #AC_PROG_CC
            #AC_PROG_INSTALL
            #AC_PROG_LN_S
            #AC_PROG_LIBTOOL
            AM_PROG_LIBTOOL
            # Checks for libraries.
            pkg_modules="gtk+-2.0 >= 2.0.0"
            PKG_CHECK_MODULES(GTK_PACKAGE, [$pkg_modules], HAVE_GTK2="yes", HAVE_GTK2="no" )
            AC_SUBST(GTK_PACKAGE_CFLAGS)
            AC_SUBST(GTK_PACKAGE_LIBS)
            # Check for dl
            DL_PRESENT=""
            AC_CHECK_LIB( dl, dlopen, DL_PRESENT="yes",, $DL_LIBS -ldl )
            if test "x$DL_PRESENT" = "xyes"; then
            AC_DEFINE(HAVE_LIBDL, 1, [Define if DL lib is present])
            DL_LIBS="-ldl"
            AC_SUBST(DL_LIBS)
            fi
            # Check for libm
            M_PRESENT=""
            AC_CHECK_LIB( m, sin, M_PRESENT="yes",, $M_LIBS -lm )
            if test "x$M_PRESENT" = "xyes"; then
            AC_DEFINE(HAVE_LIBM, 1, [Define if libm is present])
            M_LIBS="-lm"
            AC_SUBST(M_LIBS)
            fi
            # Check for pthread 
            PTHREAD_PRESENT=""
            AC_CHECK_LIB( pthread, pthread_create, PTHREAD_PRESENT="yes",, $PTHREAD_LIBS
            -lpthread )
            if test "x$PTHREAD_PRESENT" = "xyes"; then
            AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if libpthread is present])
            PTHREAD_LIBS="-lpthread"
            AC_SUBST(PTHREAD_LIBS)
            fi
            # Checks for header files.
            #AC_HEADER_DIRENT
            #AC_HEADER_STDC
            #AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h])
            # Checks for typedefs, structures, and compiler characteristics.
            #AC_TYPE_PID_T
            #AC_TYPE_SIZE_T
            #AC_HEADER_TIME
            # Checks for library functions.
            #AC_FUNC_CLOSEDIR_VOID
            #AC_FUNC_MALLOC
            #AC_CHECK_FUNCS([memset strstr])
            AC_CONFIG_FILES([Makefile
                         src/Makefile
                         data/Makefile
                         doc/Makefile])
            AC_OUTPUT

            2.生成各目錄下的Makefile.am文件
            ./Makefile.am   //工程目錄下
              SUBDIR = src data doc
            ../src/Makefile.am  //源碼目錄下
              MAINTAINERCLEANFILES = Makefile.in
               INCLUDES = -I../include  
               CPPFLAGS=-DINSTALL_PREFIX="\"$(prefix)\""
               lib_LTLIBRARIES = libtest.la
               libtest_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@
               libtest_la_SOURCES = \
                                  test.c \
                                  test_private.h \
                                  check_match.c \
                                  check_match.h \
                                  test_helpers.c \
                                  test_helpers.h \
                                  debug.h
                libtest_la_LIBADD = \
                                  @DL_LIBS@ \
                                  @M_LIBS@

            3. 生成autogen.sh腳本, 內(nèi)容
            #! /bin/sh
            set -x
            aclocal
            autoheader
            automake --foreign --add-missing --copy
            autoconf

            保存后修改權(quán)限 chmod a+x autogen.sh

            3.運(yùn)行腳本./autogen.sh, 生成configure腳本. 這里可能會(huì)遇到錯(cuò)誤, 可以根據(jù)錯(cuò)誤提示作相應(yīng)修改.(注意:如果您修改了Makefile.am中的項(xiàng),那么就得重新執(zhí)行這一步)

            4.運(yùn)行./configure腳本.自動(dòng)生成src目錄下的makefile文件

            5. 切換到目錄src, 運(yùn)行make 自動(dòng)在當(dāng)前目錄下建立.libs文件, 編程生成的庫文件就保存在該目錄下.
                make install 安裝在默認(rèn)目錄 /usr/local/lib/下.

            6.如果要生成其它的安裝目錄,Makefile.am就要這樣寫
            MAINTAINERCLEANFILES = Makefile.in
            INCLUDES = -I../include 
            lib_LTLIBRARIES = libtt.la
            libdir = $(prefix)/lib/test  //這個(gè)就是安裝目錄
            libtt_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@
            libtt_la_LIBADD = @PTHREAD_LIBS@
            libtt_la_SOURCES = \
                            tt.c \
                            video.c \
                            video.h

            當(dāng)然,Makefile中的語法規(guī)則中還有很多宏定義,您可以在Makefile的官方網(wǎng)站找到說明。
            下一篇就打算寫寫條件編譯的Makefile寫法。







             

            posted on 2011-12-19 22:47 likun 閱讀(1142) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++ 、Linux environment programming 、DEBUG
            日韩精品久久无码人妻中文字幕| 国产高潮国产高潮久久久| 国产叼嘿久久精品久久| 色综合久久久久网| 99久久www免费人成精品| 精品久久久久久无码国产 | 国产精自产拍久久久久久蜜| 91久久精品国产成人久久| 国产综合成人久久大片91| 久久午夜免费视频| 精品一区二区久久久久久久网站| 国产精品99久久精品爆乳| 伊人久久大香线蕉精品不卡 | 久久99精品久久久大学生| 一本久久a久久精品vr综合| 伊人久久大香线焦综合四虎| 99久久99久久精品国产片果冻| 久久综合久久综合久久综合| 亚洲va久久久噜噜噜久久天堂 | 久久久久久久久66精品片| 久久精品中文字幕久久| 亚洲AV无码久久精品狠狠爱浪潮| 狠狠人妻久久久久久综合| 波多野结衣中文字幕久久| 一97日本道伊人久久综合影院| 精品国产青草久久久久福利| 国产精品久久久久久久久鸭| AV无码久久久久不卡蜜桃| 久久99热这里只有精品66| 亚洲精品无码专区久久同性男| 欧美性猛交xxxx免费看久久久| 久久99亚洲综合精品首页| 久久久久亚洲精品中文字幕| 精品欧美一区二区三区久久久| 久久人人爽人人爽人人片AV东京热 | 久久久噜噜噜www成人网| 久久综合九色综合网站| 国产一区二区三区久久| 久久精品国产99久久丝袜| 99精品国产99久久久久久97| 精品久久久久久亚洲精品|