Tar*_*ula 2 c++ gcc g++ autotools shared-libraries
我想要做的是创建一个新的共享库,称为libxxx链接另一个被称为libzzz共享库的共享库,这个共享库有一个独立的"pkg-config"式工具,假设它叫做"zzz-config",它提供了所需的cflags在编译阶段使用时libzzz.我想做的是:
zzz-config上面引用的脚本;src目录的源并将编译的文件放在另一个目录中我已经阅读了几乎所有可用的autotools教程,但我无法想办法做到这一点,如果你能指出一些例子会非常友善.
谢谢 !
用autotools做这个很容易.有几点需要注意:libzzz可能会提供一个宏来为您完成大部分工作.例如,glib提供了一个名为AM_PATH_GLIB_2_0的宏,它与库一起安装,因此您只需要在configure.ac中调用它.(请注意,宏名称错误,因为它踩踏了automake的命名空间,但这完全是另一个问题.)这是一个示例configure.ac和Makefile.am,它可以满足您的需求(请参阅下面的有关调试和发布版本的注释):
configure.ac:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.66])
AC_INIT([libxxx], [0.0.0], [alice@bob.com])
AC_CONFIG_SRCDIR([libxxx.cc])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign])
LT_INIT
AC_PROG_CXX
# Checks for libraries.
# If libzzz has an autoconf macro use it. Otherwise:
AC_PATH_PROG([ZZZ_CONFIG],[zzz-config],[none])
AS_IF([test x"$ZZZ_CONFIG" = xnone],[
AC_MSG_ERROR([zzz-config not found in PATH])
])
CPPFLAGS="$CPPFLAGS $(zzz-config -cflags)"
LIBS="$(zzz-config -libs) $LIBS" # Totally unnecessary: we're not linking
# If zzz-config is found, we can probably assume that
# libzzz is installed, but check anyway:
AC_CHECK_LIB([zzz],[main],[],[AC_MSG_ERROR([libzzz required])])
# Checks for header files.
AC_CHECK_HEADERS([zzz.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Makefile.am
lib_LTLIBRARIES = libxxx.la libxxx_la_SOURCES = libxxx.cc include_HEADERS = xxx.h libxxx_la_LDFLAGS = -version-info 0:0:0
在进行调试或发布构建方面,有很多方法可以使用不涉及编辑构建脚本的autotools.执行此操作的规范方法是在调用configure时设置CXXFLAGS(例如,将CXXFLAGS = -O2 CPPFLAGS = -DNDEBUG作为参数进行配置以获取发布版本).您还可以设置系统,以便通过将这些分配写入/usr/local/share/config.site,在/ usr/local中安装的所有内容都是发布版本,而在$ HOME中安装的所有内容都将是调试版本将'CXXFLAGS =" - g -O0"'写入$ HOME/share/config.site.如果要在配置时为用户提供--disable-assert选项以关闭断言,则可以在configure.ac中调用AC_HEADER_ASSERT(但用户将-DNDEBUG放入CPPFLAGS实际上同样容易).
但是,如果您真的觉得需要在构建脚本中添加功能,可以尝试在configure.ac中添加这样的内容:
AC_ARG_ENABLE([debug],AS_HELP_STRING([--enable-debug],
[configure a debug build]),
[CXXFLAGS="$CXXFLAGS -g -O0"])
AC_ARG_ENABLE([release],AS_HELP_STRING([--enable-release],
[configure a release build]),
[CPPFLAGS="$CPPFLAGS -DNDEBUG"]
[CXXFLAGS="$CXXFLAGS -O2"])
请注意,这不可靠,可能会导致用户混淆.例如,如果用户使用config.site将CPPFLAGS设置为-DDEBUG但调用--enable-release,则CPPFLAGS将包含"-DDEBUG -DNDEBUG".如果您尝试完全重置CPPFLAGS以响应--enable-release,那么libzzz所需的-I标志将会丢失.您可以通过AC_SUBST'ing LIBZZZ_CFLAGS并对Makefile.am进行修改来避免最后一个问题,但是当他们调用configure时,让用户更容易设置CPPFLAGS和CXXFLAGS.
| 归档时间: |
|
| 查看次数: |
2544 次 |
| 最近记录: |