C++ 使用自动工具创建新的共享库

C++ 使用自动工具创建新的共享库,c++,gcc,g++,shared-libraries,autotools,C++,Gcc,G++,Shared Libraries,Autotools,我想做的是创建一个名为libxxx的新共享库,它链接到另一个名为libzzz的共享库,这个共享库有一个独立的类似于“pkg config”的工具,比如说它名为“zzz config”,它提供了使用libzzz时编译阶段所需的cflag。 我想做的是: 创建configure/makefile等。。使用automake、autoconf等自动工具 它必须使用上面引用的zzz-config脚本 它必须自动生成源的依赖项 它必须具有构建调试(无优化)和发布(有优化)构建的模式 源为C++; 它必须以

我想做的是创建一个名为
libxxx
的新共享库,它链接到另一个名为
libzzz
的共享库,这个共享库有一个独立的类似于“pkg config”的工具,比如说它名为“zzz config”,它提供了使用
libzzz
时编译阶段所需的cflag。 我想做的是:

  • 创建configure/makefile等。。使用automake、autoconf等自动工具
  • 它必须使用上面引用的
    zzz-config
    脚本
  • 它必须自动生成源的依赖项
  • 它必须具有构建调试(无优化)和发布(有优化)构建的模式 源为C++;<李>
  • 它必须以共享库为目标
  • 它必须读取
    src
    目录的源代码,并将编译后的文件放在另一个目录中
我已经阅读了几乎所有可用的autotools教程,但我无法找到一种方法来做到这一点,如果您能指出一些例子,我将非常感谢

谢谢大家!

我的建议是使用自动工具,而不是
autotools
。它更易于使用,而且还将创建与平台相关的项目(即基于Makefile的项目、VisualStudio项目、EclipseCDT项目等)

它还将创建
debug
release
项目,具体取决于
CMAKE\u BUILD\u类型
变量值

创建
libxxx
库非常简单:

add_library(libxxx SHARED ${LIBXXX_SOURCES})
其中,
LIBXXX_SOURCES
是保存源的变量

链接这两个库同样简单(请参阅):

要从
zzz config
脚本中获取编译标志,可以使用如下命令:

execute_process(COMMAND ./zzz-config 
                WORKING_DIRECTORY "<your_working_directory>"
                OUTPUT_VARIABLE ZZZ_FLAGS)
execute_进程(命令。/zzz配置
工作目录“”
输出_变量(ZZZ_标志)

然后您可以设置
CMAKE\u C\u标志
CMAKE\u CXX\u标志
变量来设置所需的编译标志。

我也不会使用自动工具

同样,我在Cmake方面的经历也不那么出色。事情可能已经改变了,但当我不久前试图学习它时,文档并不在那里

我倾向于使用烤饼:

也就是说,我不知道它在大型项目(即数千个或更多文件)上的性能如何。不过,对于小型或中型项目来说,这也不错


您也可以尝试qmake,但我只建议您使用Qt。

使用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 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"]) #-*-Autoconf-*- #使用autoconf处理此文件以生成配置脚本。 AC_预请求([2.66]) AC_INIT([libxxx],[0.0.0][alice@bob.com]) AC_CONFIG_SRCDIR([libxxx.cc]) AC_配置_头([CONFIG.h]) AM_INIT_AUTOMAKE([国外]) 它在里面 AC_PROG_CXX #检查图书馆。 #如果libzzz有autoconf宏,请使用它。否则: AC_路径_程序([ZZZ_配置],[ZZZ配置],[none]) 假设([测试x“$ZZZ_配置”=xnone][ AC_MSG_错误([zzz配置未在路径中找到]) ]) CPPFLAGS=“$CPPFLAGS$(zzz配置-cflags)” LIBS=“$(zzz config-LIBS)$LIBS”#完全没有必要:我们没有链接 #如果找到ZZCONFIG,我们可能会假设 #已安装libzzz,但仍要检查: AC_CHECK_LIB([zzz],[main],[AC_MSG_ERROR([libzzz required])) #检查头文件。 AC_检查_标题([zzz.h]) AC_配置_文件([Makefile]) 交流输出 Makefile.am

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

但是,如果确实需要将功能添加到构建脚本中,可以尝试在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 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"]) AC_ARG_ENABLE([debug]),AS_HELP_STRING([--ENABLE debug], [配置调试生成], [CXXFLAGS=“$CXXFLAGS-g-O0”]) AC_ARG_ENABLE([release]),作为帮助字符串([--ENABLE release], [配置发布版本], [CPPFLAGS=“$CPPFLAGS-DNDEBUG”] [CXXFLAGS=“$CXXFLAGS-O2”]) 请注意,这是不可靠的,可能会导致用户混淆。例如,如果用户使用config.site将CPPFLAGS设置为-DDEBUG,但调用--enable release,那么CPPFLAGS将包括“-DDEBUG-DNDEBUG”。如果您尝试完全重置CPPFLAGS以响应--enable release,那么libzzz所需的-I标志将丢失。你可以通过替换LIBZZZ和mod来避免最后一个问题