我想要做的是创建一个名为libxxx
的新共享库,它链接另一个名为libzzz
的共享库,这个共享库有一个独立的“pkg-config”式工具,让我们说它叫做“zzz-config”,在使用libzzz
时会给出编译阶段所需的cflags。
我想做的是:
zzz-config
脚本; src
目录的来源并将编译后的文件放在另一个目录中我已经阅读了几乎所有可用的autotools教程,但是我无法想办法做到这一点,如果你能指出一些例子会非常友善。
谢谢!
答案 0 :(得分:7)
使用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实际上同样容易)。您可以做的另一件好事是利用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标志将会丢失。您可以通过AC_SUBST'ing LIBZZZ_CFLAGS并对Makefile.am进行修改来避免最后一个问题,但是当他们调用configure时,让用户更容易设置CPPFLAGS和CXXFLAGS。
答案 1 :(得分:0)
我也会远离autotools。
同样,我对Cmake的经历也不那么出色。事情可能已经发生了变化,但是当我试图在一段时间内学习它时,文档就不存在了。
我倾向于使用scons:http://www.scons.org/
那就是说我不知道它在大型项目上的表现如何(即数千或更多的文件)。对于小型或中型项目,它很好。
您也可以尝试qmake,但我只建议您使用Qt。
答案 2 :(得分:-1)
我的建议是使用CMake代替autotools
。它更容易使用,它还将创建与平台相关的项目(即基于Makefile的项目,Visual Studio项目,Eclipse CDT项目等)。
它还会创建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
变量来设置所需的编译标记。