免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7808 | 回复: 3

利用libtool自动生成动态库的Makefile的生成方法 [复制链接]

论坛徽章:
0
发表于 2006-08-14 20:31 |显示全部楼层

  1. #
  2. #
  3. # 利用libtool自动生成动态库
  4. #
  5. 1. autoscan命令在当前目录生成configure.scan文件, 内容为:
  6. # -*- Autoconf -*-
  7. # Process this file with autoconf to produce a configure script.
  8. AC_PREREQ(2.57)
  9. AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
  10. AC_CONFIG_SRCDIR([src/bot.h])
  11. AC_CONFIG_HEADER([config.h])
  12. # Checks for programs.
  13. AC_PROG_CXX
  14. AC_PROG_CC
  15. # Checks for libraries.
  16. # Checks for header files.
  17. AC_HEADER_STDC
  18. AC_CHECK_HEADERS([limits.h malloc.h stdlib.h string.h unistd.h])
  19. # Checks for typedefs, structures, and compiler characteristics.
  20. AC_HEADER_STDBOOL
  21. AC_C_CONST
  22. AC_C_INLINE
  23. # Checks for library functions.
  24. AC_FUNC_MALLOC
  25. AC_FUNC_REALLOC
  26. AC_CHECK_FUNCS([memset strcasecmp strchr strdup])
  27. AC_OUTPUT
  28. 将其该名为configure.ac 然后修改:
  29. configure.ac 文件是 autoconf 的输入文件,经过 autoconf 处理,展开里面的 m4宏,
  30. 输出的是 configure 脚本。
  31. 第 4 行声明本文件要求的 autoconf 版本,因为本例使用了新版本 2.57,所以在此注明。
  32. 第 5 行 AC_INIT 宏用来定义软件的名称和版本等信息
  33. AC_INIT([test], 1.0, [email]linhanzu@gmail.com[/email])
  34. 增加版本信息(为生成lib库做准备)
  35. lt_major=1
  36. lt_age=1
  37. lt_revision=12
  38. dist_version=0.1.12
  39. AM_INIT_AUTOMAKE(test, $dist_version) //自动生成Makefile文件
  40. 增加宏, 打开共享库
  41. AC_PROG_LIBTOOL
  42. # Check for dl  
  43. DL_PRESENT=""
  44. AC_CHECK_LIB( dl, dlopen, DL_PRESENT="yes",, $DL_LIBS -ldl )
  45. if test "x$DL_PRESENT" = "xyes"; then
  46. AC_DEFINE(HAVE_LIBDL, 1, [Define if DL lib is present])
  47. DL_LIBS="-ldl"
  48. AC_SUBST(DL_LIBS)
  49. fi
  50. # Check for libm
  51. M_PRESENT=""
  52. AC_CHECK_LIB( m, sin, M_PRESENT="yes",, $M_LIBS -lm )
  53. if test "x$M_PRESENT" = "xyes"; then
  54. AC_DEFINE(HAVE_LIBM, 1, [Define if libm is present])
  55. M_LIBS="-lm"
  56. AC_SUBST(M_LIBS)
  57. fi
  58. 增加依赖库,这里就仅仅列举了pthread库,生成的Makefile会自动加上-pthread
  59. # Check for pthread
  60. PTHREAD_PRESENT=""
  61. AC_CHECK_LIB( pthread, pthread_create, PTHREAD_PRESENT="yes",, $PTHREAD_LIBS
  62. -lpthread )
  63. if test "x$PTHREAD_PRESENT" = "xyes"; then
  64. AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if libpthread is present])
  65. PTHREAD_LIBS="-lpthread"
  66. AC_SUBST(PTHREAD_LIBS)
  67. fi
  68. 要生成项目工程目录和其它目录下的Makefile 文件, 必需加入
  69. AM_CONFIG_FILES的宏:
  70. 例如: AC_CONFIG_FILES([Makefile
  71.                      src/Makefile
  72.                      data/Makefile
  73.                      docs/Makefile])
  74. 修改完后Makefile.ac如下:
  75. # -*- Autoconf -*-
  76. # Process this file with autoconf to produce a configure script.
  77. AC_PREREQ(2.57)
  78. AC_INIT([test],[1.0],[[email]arne_caspari@users.sourceforge.net[/email]])
  79. AM_CONFIG_HEADER(config.h)
  80. lt_major=1
  81. lt_age=1
  82. lt_revision=12
  83. dist_version=0.1.12
  84. AM_INIT_AUTOMAKE(test, $dist_version)
  85. AC_SUBST(lt_major)
  86. AC_SUBST(lt_revision)
  87. AC_SUBST(lt_age)
  88. # Checks for programs.
  89. #AC_PROG_CC
  90. #AC_PROG_INSTALL
  91. #AC_PROG_LN_S
  92. #AC_PROG_LIBTOOL
  93. AM_PROG_LIBTOOL
  94. # Checks for libraries.
  95. pkg_modules="gtk+-2.0 >= 2.0.0"
  96. PKG_CHECK_MODULES(GTK_PACKAGE, [$pkg_modules], HAVE_GTK2="yes", HAVE_GTK2="no" )
  97. AC_SUBST(GTK_PACKAGE_CFLAGS)
  98. AC_SUBST(GTK_PACKAGE_LIBS)
  99. # Check for dl
  100. DL_PRESENT=""
  101. AC_CHECK_LIB( dl, dlopen, DL_PRESENT="yes",, $DL_LIBS -ldl )
  102. if test "x$DL_PRESENT" = "xyes"; then
  103. AC_DEFINE(HAVE_LIBDL, 1, [Define if DL lib is present])
  104. DL_LIBS="-ldl"
  105. AC_SUBST(DL_LIBS)
  106. fi
  107. # Check for libm
  108. M_PRESENT=""
  109. AC_CHECK_LIB( m, sin, M_PRESENT="yes",, $M_LIBS -lm )
  110. if test "x$M_PRESENT" = "xyes"; then
  111. AC_DEFINE(HAVE_LIBM, 1, [Define if libm is present])
  112. M_LIBS="-lm"
  113. AC_SUBST(M_LIBS)
  114. fi
  115. # Check for pthread
  116. PTHREAD_PRESENT=""
  117. AC_CHECK_LIB( pthread, pthread_create, PTHREAD_PRESENT="yes",, $PTHREAD_LIBS
  118. -lpthread )
  119. if test "x$PTHREAD_PRESENT" = "xyes"; then
  120. AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if libpthread is present])
  121. PTHREAD_LIBS="-lpthread"
  122. AC_SUBST(PTHREAD_LIBS)
  123. fi
  124. # Checks for header files.
  125. #AC_HEADER_DIRENT
  126. #AC_HEADER_STDC
  127. #AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h])
  128. # Checks for typedefs, structures, and compiler characteristics.
  129. #AC_TYPE_PID_T
  130. #AC_TYPE_SIZE_T
  131. #AC_HEADER_TIME
  132. # Checks for library functions.
  133. #AC_FUNC_CLOSEDIR_VOID
  134. #AC_FUNC_MALLOC
  135. #AC_CHECK_FUNCS([memset strstr])
  136. AC_CONFIG_FILES([Makefile
  137.              src/Makefile
  138.              data/Makefile
  139.              doc/Makefile])
  140. AC_OUTPUT

  141. 2.生成各目录下的Makefile.am文件
  142. ./Makefile.am   //工程目录下
  143.   SUBDIR = src data doc
  144. ../src/Makefile.am  //源码目录下
  145.   MAINTAINERCLEANFILES = Makefile.in
  146.    INCLUDES = -I../include  
  147.    CPPFLAGS=-DINSTALL_PREFIX="\"$(prefix)\""
  148.    lib_LTLIBRARIES = libtest.la
  149.    libtest_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@
  150.    libtest_la_SOURCES = \
  151.                       test.c \
  152.                       test_private.h \
  153.                       check_match.c \
  154.                       check_match.h \
  155.                       test_helpers.c \
  156.                       test_helpers.h \
  157.                       debug.h
  158.     libtest_la_LIBADD = \
  159.                       @DL_LIBS@ \
  160.                       @M_LIBS@

  161. 3. 生成autogen.sh脚本, 内容
  162. #! /bin/sh
  163. set -x
  164. aclocal
  165. autoheader
  166. automake --foreign --add-missing --copy
  167. autoconf

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

  169. 3.运行脚本./autogen.sh, 生成configure脚本. 这里可能会遇到错误, 可以根据错误提示作相应修改.(注意:如果您修改了Makefile.am中的项,那么就得重新执行这一步)

  170. 4.运行./configure脚本.自动生成src目录下的makefile文件

  171. 5. 切换到目录src, 运行make 自动在当前目录下建立.libs文件, 编程生成的库文件就保存在该目录下.
  172.     make install 安装在默认目录 /usr/local/lib/下.

  173. 6.如果要生成其它的安装目录,Makefile.am就要这样写
  174. MAINTAINERCLEANFILES = Makefile.in
  175. INCLUDES = -I../include
  176. lib_LTLIBRARIES = libtt.la
  177. libdir = $(prefix)/lib/test  //这个就是安装目录
  178. libtt_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@
  179. libtt_la_LIBADD = @PTHREAD_LIBS@
  180. libtt_la_SOURCES = \
  181.                 tt.c \
  182.                 video.c \
  183.                 video.h

  184. 当然,Makefile中的语法规则中还有很多宏定义,您可以在Makefile的官方网站找到说明。
  185. 下一篇就打算写写条件编译的Makefile写法。
复制代码

[ 本帖最后由 gomo1234 于 2006-12-15 16:04 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-08-14 23:11 |显示全部楼层
最好做个简单的总结.

论坛徽章:
0
发表于 2006-08-15 19:48 |显示全部楼层

to 斑竹

已经很简单了。如果不把生成的东西都列出,就越发看不明白了。

论坛徽章:
0
发表于 2006-09-01 15:08 |显示全部楼层
谢谢gomo1234发表的东西,看了之后收获很大

另:请问哪里能找到一些关于 configure.ac、makefile.ma的语法规则的资料呢?

看过一些,但是版本都很旧,很多宏现在都已经不用了,所以想看看近一年,差不多GUN的版本在3.8以上的资料

请高手们指点指点~~~ 多谢 ^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP