利用libtool自动生成动态库的Makefile的生成方法

发布于 2022-07-21 18:13:25 字数 8786 浏览 14 评论 3

  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 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

笔落惊风雨 2022-07-25 21:34:23

谢谢gomo1234发表的东西,看了之后收获很大

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

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

请高手们指点指点~~~ 多谢 ^_^

猥琐帝 2022-07-25 14:46:53

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

情深缘浅 2022-07-21 19:50:52

最好做个简单的总结.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文