青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Networking /C++/Linux

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

常用鏈接

留言簿(4)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

用automake建立共享庫(動態鏈接庫)Makefile

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

這里用的autoconf是2.67版本,在debian下實現:

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

這里建立一個簡單的函數庫來介紹:

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

$mkdir rx
$mkdir rx/src

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

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文件,只要包含其存放源碼的子目錄即可,內容如下:

AUTOMAKE_OPTIONS=foreign
SUBDIRS
=src

rx/src目錄下的Makefile.am內容如下:

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

其中lib_LTLIBRARIES=后面的“librx.la”為要生成的庫文件名,必須寫成.la,不能是.so,實際會生成librx.so文件。

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

include_HEADERS=后面的為頭文件,是供其它程序包含用的,make install時會復制到安裝目錄的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])

編譯這個文件:

$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一句,即把包的全名、版本號及BUG報告email地址添上,如:

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

在它后面加一句:

AM_INIT_AUTOMAKE

這句話是必須的。

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

# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL

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

AC_OUTPUT([Makefile
src
/Makefile])

這樣,configure.ac就建好了,修改后的內容如下:

# -*- 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])

然后按順序執行:

$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'

這時configure腳本已經生成了。

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

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

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

$make


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

mybdebian:/home/myb/php/rx/src/.libs# ls -l
總計
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

我們再回到頂層目錄,執行make install可以自動安裝生成的庫到/usr/local/armrx2d/lib目錄下。

若使用automake時出現下面錯誤信息

required file `./ltmain.sh' not found

是因為libtool未配置:

解決辦法:

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

或:

$libtoolize --automake

#
#
# 利用libtool自動生成動態庫
#
1. autoscan命令在當前目錄生成configure.scan文件, 內容為:
# -*- 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 的輸入文件,經過 autoconf 處理,展開里面的 m4宏,
輸出的是 configure 腳本。
第 4 行聲明本文件要求的 autoconf 版本,因為本例使用了新版本 2.57,所以在此注明。
第 5 行 AC_INIT 宏用來定義軟件的名稱和版本等信息
AC_INIT([test], 1.0, [email]linhanzu@gmail.com[/email])
增加版本信息(為生成lib庫做準備)
lt_major=1
lt_age=1
lt_revision=12
dist_version=0.1.12
AM_INIT_AUTOMAKE(test, $dist_version) //自動生成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會自動加上-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
要生成項目工程目錄和其它目錄下的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腳本, 內容
#! /bin/sh
set -x
aclocal
autoheader
automake --foreign --add-missing --copy
autoconf

保存后修改權限 chmod a+x autogen.sh

3.運行腳本./autogen.sh, 生成configure腳本. 這里可能會遇到錯誤, 可以根據錯誤提示作相應修改.(注意:如果您修改了Makefile.am中的項,那么就得重新執行這一步)

4.運行./configure腳本.自動生成src目錄下的makefile文件

5. 切換到目錄src, 運行make 自動在當前目錄下建立.libs文件, 編程生成的庫文件就保存在該目錄下.
    make install 安裝在默認目錄 /usr/local/lib/下.

6.如果要生成其它的安裝目錄,Makefile.am就要這樣寫
MAINTAINERCLEANFILES = Makefile.in
INCLUDES = -I../include 
lib_LTLIBRARIES = libtt.la
libdir = $(prefix)/lib/test  //這個就是安裝目錄
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

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







 

posted on 2011-12-19 22:47 likun 閱讀(1163) 評論(0)  編輯 收藏 引用 所屬分類: C/C++ 、Linux environment programming 、DEBUG
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲综合好骚| 久久久精品久久久久| 亚洲日本aⅴ片在线观看香蕉| 欧美日韩国产探花| 免费观看30秒视频久久| 欧美在线关看| 午夜在线一区| 欧美一区2区三区4区公司二百| 日韩一级欧洲| 一区二区电影免费观看| 亚洲午夜精品在线| 亚洲制服丝袜在线| 久久久国产精品亚洲一区 | 亚洲国产人成综合网站| 一本色道久久综合亚洲精品小说 | 精品99一区二区三区| 国产欧美高清| 国产一区观看| 亚洲免费大片| 亚洲一区国产视频| 欧美在线视频免费| 免费成人性网站| 欧美1区2区视频| 亚洲国产精品美女| 一区二区日韩欧美| 欧美亚洲网站| 欧美成人性生活| 国产精品视频九色porn| 韩日精品中文字幕| 国产视频欧美视频| 亚洲激情av在线| 亚洲自拍16p| 欧美~级网站不卡| 日韩视频在线一区| 欧美一区二区三区在线视频 | 国产农村妇女毛片精品久久麻豆 | 久久综合一区| 国产精品国产三级国产a| 韩日视频一区| 一区二区三区高清| 久久精品国产成人| 亚洲激情在线观看| 久久国产精品久久w女人spa| 欧美大香线蕉线伊人久久国产精品| 欧美午夜一区二区三区免费大片| 韩日欧美一区二区三区| 在线视频日韩| 蜜臀91精品一区二区三区| 99国内精品| 久久九九免费视频| 国产精品无码永久免费888| 亚洲欧洲一区二区在线观看| 新片速递亚洲合集欧美合集| 欧美高清在线视频| 亚洲免费在线看| 欧美精品在线一区| 国产一区二区日韩精品欧美精品 | 亚洲欧美激情视频在线观看一区二区三区 | 香蕉久久夜色精品国产| 欧美日韩 国产精品| 亚洲电影av在线| 欧美一区午夜精品| 夜夜夜久久久| 欧美日韩视频| 美女图片一区二区| 亚洲人成网站精品片在线观看| 午夜一区二区三区在线观看| 一区二区av| 国产精品毛片a∨一区二区三区|国| 亚洲免费av网站| 亚洲国产高清一区| 久久久精品日韩欧美| 国产日韩欧美精品在线| 性欧美暴力猛交另类hd| 亚洲视频视频在线| 欧美午夜精品伦理| 在线综合亚洲欧美在线视频| 亚洲日韩第九十九页| 欧美成人网在线| 亚洲毛片在线观看| 亚洲精品美女久久久久| 欧美大片在线看| 亚洲精品国产精品国产自| 亚洲精品小视频| 欧美午夜精品久久久久久久| 亚洲自拍啪啪| 香蕉精品999视频一区二区 | 欧美日韩精品二区| 亚洲视频1区| 一区二区三区国产| 国产一区二区在线免费观看| 久久综合狠狠综合久久综青草| 欧美制服丝袜第一页| 伊人伊人伊人久久| 欧美激情在线| 国产精品成人免费| 欧美在现视频| 久久综合99re88久久爱| 亚洲美女尤物影院| 亚洲砖区区免费| 久久国产精彩视频| 亚洲最新视频在线播放| 亚洲夜晚福利在线观看| 国产亚洲精品v| 91久久精品一区二区三区| 欧美无乱码久久久免费午夜一区| 久久精品欧美日韩精品| 老鸭窝亚洲一区二区三区| 亚洲午夜激情| 久久精品国产一区二区电影| 亚洲精品日韩激情在线电影| 久久精品99国产精品日本| 国产精品免费在线| 亚洲国产精品久久久久秋霞影院| 欧美日韩在线另类| 久久久久国产精品一区| 欧美日韩国产综合久久| 欧美有码在线视频| 欧美极品aⅴ影院| 久久国产黑丝| 欧美精品免费播放| 久久精品国产第一区二区三区最新章节 | 亚洲天堂av电影| 一区免费在线| 亚洲私人影院在线观看| 99热这里只有成人精品国产| 性色一区二区三区| 亚洲欧美影院| 欧美日本久久| 欧美激情一区在线观看| 国产日产欧产精品推荐色| 亚洲激情网站免费观看| 伊人春色精品| 欧美一级在线播放| 午夜亚洲影视| 国产精品v欧美精品∨日韩| 欧美成人dvd在线视频| 国产精品香蕉在线观看| 一区二区三区视频在线看| 亚洲毛片在线| 欧美韩日一区二区三区| 美女黄色成人网| 国语自产精品视频在线看一大j8 | 亚洲欧美国产高清| 欧美久久一区| 亚洲丰满在线| 亚洲电影有码| 久久综合伊人77777| 久久久久久久久蜜桃| 国产精品欧美风情| 亚洲一区视频| 欧美影院一区| 影视先锋久久| 免费不卡亚洲欧美| 欧美成人精品在线播放| 激情文学综合丁香| 久久久福利视频| 美女精品国产| 亚洲精品黄网在线观看| 欧美成人精品一区二区| 亚洲国产另类久久久精品极度| 最新亚洲视频| 久久在线免费观看| 亚洲精品视频在线播放| 亚洲一区二区三区四区五区午夜| 欧美网站在线观看| 欧美一激情一区二区三区| 久久裸体视频| 亚洲国产综合91精品麻豆| 欧美日韩大片| 午夜精品久久久久久久99水蜜桃 | 久久久久欧美精品| 国产一区二区三区日韩欧美| 性欧美xxxx大乳国产app| 久久久亚洲高清| 亚洲国产精品精华液2区45| 免费久久99精品国产| 亚洲国产精品一区| 亚洲一区图片| 国模大胆一区二区三区| 欧美韩国一区| 这里只有精品丝袜| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产日韩欧美不卡在线| 久久精品国产欧美激情| 欧美成人蜜桃| 亚洲免费视频网站| 亚洲精品日产精品乱码不卡| 欧美丝袜一区二区三区| 老司机午夜精品视频| 亚洲女人天堂av| 亚洲精品少妇网址| 免费精品视频| 久久蜜桃资源一区二区老牛| 亚洲一区二区三区高清不卡| 亚洲国产精品悠悠久久琪琪| 国产精品综合久久久| 欧美激情成人在线视频| 久久久噜噜噜久噜久久| 亚洲砖区区免费|