linux makefile建立动态库,利用libtool自动生成动态库的Makefile的生成方法

#

#

# 利用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写法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译iOS动态库版本的SPICE需要进行如下步骤: 1. 下载SPICE源代码并解压缩。 2. 打开终端,进入SPICE源代码目录。 3. 编辑src/spice-client/Makefile.am文件,将以下代码: ``` libspice-client-glib-2.0.la: $(SPICE_CLIENT_GLIB_2_0_LIBS) $(libtool) --tag=CC --mode=link $(CC) $(AM_CFLAGS) $(LDFLAGS) -o $@ $(SPICE_CLIENT_GLIB_2_0_LIBS) $(INTROSPECTION_LIBS) $(LIBS) ``` 替换为: ``` libspice-client-glib-2.0.la: $(SPICE_CLIENT_GLIB_2_0_LIBS) $(libtool) -dynamic $(NO_INSTALL) --tag=CC --mode=link $(CC) $(AM_CFLAGS) $(LDFLAGS) -o $@ $(SPICE_CLIENT_GLIB_2_0_LIBS) $(INTROSPECTION_LIBS) $(LIBS) ``` 4. 编辑src/spice-client/Makefile.in文件,将以下代码: ``` libspice-client-glib-2.0.la: $(SPICE_CLIENT_GLIB_2_0_LIBS) $(LIBTOOL) --tag=CC --mode=link $(CC) $(AM_CFLAGS) $(LDFLAGS) -o $@ $(SPICE_CLIENT_GLIB_2_0_LIBS) $(INTROSPECTION_LIBS) $(LIBS) ``` 替换为: ``` libspice-client-glib-2.0.la: $(SPICE_CLIENT_GLIB_2_0_LIBS) $(LIBTOOL) -dynamic $(NO_INSTALL) --tag=CC --mode=link $(CC) $(AM_CFLAGS) $(LDFLAGS) -o $@ $(SPICE_CLIENT_GLIB_2_0_LIBS) $(INTROSPECTION_LIBS) $(LIBS) ``` 5. 编辑configure.ac文件,在AC_INIT行下方添加以下代码: ``` LT_INIT([disable-static]) ``` 6. 执行以下命令生成configure脚本: ``` autoreconf -fiv ``` 7. 针对iOS平台,需要使用Xcode中提供的工具集进行编译。打开终端,进入SPICE源代码目录,执行以下命令: ``` ./configure --host=arm-apple-darwin --prefix=/usr/local --disable-smartcard make make install ``` 其中,--host=arm-apple-darwin表示编译iOS动态库版本;--prefix=/usr/local表示安装路径为/usr/local;--disable-smartcard表示禁用智能卡支持。 8. 编译完成后,在/usr/local/lib目录下可以找到libspice-client-glib-2.0.dylib文件,这就是SPICE的iOS动态库版本。 请注意,以上步骤仅供参考,具体操作可能因版本和环境而异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值