代码之家  ›  专栏  ›  技术社区  ›  Tarantula

为新的共享库使用自动工具

  •  2
  • Tarantula  · 技术社区  · 16 年前

    我想做的是创建一个名为 libxxx 与另一个叫做 libzzz 利布兹 .

    • 创建configure/makefile等。。使用自动工具,如automake、autoconf等;
    • zzz-config 上面引用的脚本;
    • 它必须自动生成源的依赖关系;
    • 它必须有一个用于构建调试(没有优化)和发布(有优化)构建的模式;
    • 它必须以共享图书馆为目标;
    • 它必须读取源代码 src

    我已经阅读了几乎所有可用的自动工具教程,但我无法想出一个方法来做到这一点,如果你能指出一些例子将是非常友好的。

    谢谢您!

    3 回复  |  直到 16 年前
        1
  •  -1
  •   the_void    16 年前

    我的建议是使用 CMake 而不是 autotools . 它更容易使用,而且还将创建与平台相关的项目(即基于Makefile的项目、visualstudio项目、eclipsecdt项目等)。

    它还将创造 debug release 项目,取决于 CMAKE_BUILD_TYPE

    创建 libxxx 库非常简单:

    add_library(libxxx SHARED ${LIBXXX_SOURCES})
    

    哪里 LIBXXX_SOURCES 是保存源的变量。

    target_link_libraries ):

    target_link_libraries(libxxx libzzz)
    

    zzz-config execute_process 像这样的命令:

    execute_process(COMMAND ./zzz-config 
                    WORKING_DIRECTORY "<your_working_directory>"
                    OUTPUT_VARIABLE ZZZ_FLAGS)
    

    然后你可以设置 CMAKE_C_FLAGS CMAKE_CXX_FLAGS 变量来设置所需的编译标志。

        2
  •  8
  •   William Pursell    5 年前

    使用自动工具很容易做到这一点。需要注意的几点:libzzz可能会提供一个宏来为您完成大部分工作。例如,glib提供了一个名为AM\u PATH\u glib\u 2\u 0的宏,它与库一起安装,因此您只需要在configure.ac中调用它(请注意,宏的名称有误,因为它会在automake的命名空间上跺脚,但这完全是另一个问题。)下面是一个示例configure.ac和Makefile.am,它可以满足您的需要(有关调试和发布版本的说明,请参见下面的内容):

    配置.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
    

    生成文件.am

    lib_LTLIBRARIES = libxxx.la
    libxxx_la_SOURCES = libxxx.cc
    include_HEADERS = xxx.h
    libxxx_la_LDFLAGS = -version-info 0:0:0
    

    就调试或发布构建而言,有很多方法可以通过自动工具来实现,这些方法根本不涉及编辑构建脚本。规范的方法是在调用configure时设置CXXFLAGS(例如,传递CXXFLAGS=-O2 CPPFLAGS=-DNDEBUG作为参数来配置以获得发布版本)。您还可以设置系统,以便通过将这些分配写入/usr/local/share/config.site,您在/usr/local中安装的所有内容都将成为发布版本,而在$HOME中安装的所有内容都将通过将'CXXFLAGS=“-g-O0”'写入$HOME/share/config.site,成为调试版本。如果您想在configure.AC中给用户一个--disable ASSERT选项来关闭断言,您可以在configure.AC中调用AC\u HEADER\u ASSERT(但对于用户来说,将-DNDEBUG放入CPPFLAGS也很容易)。您可以做的另一件好事是利用automake的VPATH构建来配置不同的构建目录,其中每个目录都进行了适当的配置。

    但是,如果确实需要将功能添加到构建脚本中,可以尝试在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标志将丢失。您可以通过替换LIBZZZ\CFLAGS并对Makefile.am进行修改来避免最后一个问题,但是在用户调用configure时设置CPPFLAGS和CXXFLAGS确实更容易。

    请看我的答案: https://stackoverflow.com/a/4680578/140750

        3
  •  0
  •   Craig Wright    16 年前

    我也会远离自动工具。

    同时,我与Cmake的合作经历也不尽如人意。事情可能已经改变了,但文档只是不在那里,当我试图学习它一段时间了。

    我喜欢用烤饼: http://www.scons.org/

    推荐文章