首页 > 其他分享 >AutoTools、Libtool介绍

AutoTools、Libtool介绍

时间:2023-10-18 16:14:59浏览次数:39  
标签:文件 AC configure Makefile ac 介绍 Libtool PROG AutoTools

目录

AutoTools

1.简介

  1. Autotools是一个代码打包和发布工具,它包含很多工具,比如说:
    1. autoconf:一个工具,从configure.ac文件生成configure脚本
    2. automake:一个工具,从Makefile.am文件生成Makefile.in文件
    3. aclocal
    4. autoheader:扫描configure.ac文件,生成config.h.in文件
    5. autoscan:一个工具,用于扫描源码生成configure.scan文件,这是configure.ac的雏形文件
  2. 因此在项目中使用autotools,则需要编写configure.acMakefile.am两个文件。

2.configure.ac文件编写规则

vscode编写Makefile.am、configure.ac,代码高亮插件:autoconf

  1. 常见宏:
    1. AC_PREREQ:声明要求autoconf工具的版本号
    2. AC_INIT:定义软件包名称、版本号、联系方式
    AC_INIT([软件包名称], [版本号], [联系方式])
    
    1. AC_CONFIG_HEADERS:通常在AC_INIT之后调用,用来生成config.h头文件
    AC_CONFIG_HEADERS([config.h])
    
    1. AM_INIT_AUTOMAKE:指定在Makefile.am中可用的Automake选项
    2. AC_MSG_ERROR:通知用户错误,例如:AC_MSG_ERROR(libpthread not found !)
    3. AC_PROG_CC:可用于检查系统下是否存在C编译器
    4. AC_PROG_CXX:可用于检查系统下是否存在C++编译器
    5. AM_PROG_AS:可用于检查系统下是否存在汇编器
    6. AC_PROG_MAKE_SET:可用于检查make工具是否定义了变量$MAKE
    7. AC_PROG_INSTALL:设置输出变量install的值
    8. AC_SUBST:设置变量的值,语法为AC_SUBST (variable, [value]),在configure.ac文件中定义好变量以后,可以在Makefile.am中使用,使用语法为@变量名@
    # 定义变量表示美元符号
    AC_SUBST([DOLLAR_SIGN],[$])
    # 定义变量表示百分比符号
    AC_SUBST([PERCENT_SIGN],[%])
    
    1. AC_MSG_WARN:提示可能出现的问题,不影响configure的继续运行
    2. AC_PATH_PROG:检查某个应用程序是否在path环境变量下
    3. AC_HEADER_STDBOOL:检查stdbool.h是否存在,是否符合 C99 或更高版本的标准。然后将检查的结果保存到ac_cv_header_stdbool_h变量
    4. AC_HAVE_LIBRARY:检查指定库是否存在
    # 语法为
    AC_HAVE_LIBRARY (library, [action-if-found], [Macro]
    [action-if-not-found], [other-libraries])
    
    # 示例:pthread存在则定义LIBS变量
    AC_HAVE_LIBRARY(pthread, LIBS="${LIBS} -lpthread", AC_MSG_ERROR(libpthread not found !))
    AC_SUBST(LIBS)
    
    1. AC_CONFIG_FILES:使用示例
    
    AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile])
    
    1. AC_OUTPUT:每一个configure.ac文件应当以AC_OUTPUT结尾
  2. 预定义变量:在configure.ac文件中使用变量的语法是${预定义变量名}
    1. CXXFLAGS:指定C++编译器的调试和优化选项。示例如下
    // -Werror表示显示错误信息
    // -O2开启优化等级2
    CXXFLAGS="-Werror -O2 -Wno-deprecated -pipe -Wall -Wno-strict-aliasing ${CXXFLAGS} -DNRUNTIME -D_GNU_SOURCE -D_REENTRANT -DBUILDTIME=`date +%s` -std=c++17 -rdynamic"
    
    1. CFLAGS:指定C编译器的调试和优化选项
    2. LDFLAGS:链接器的选项
    3. LIBS:-l options to pass to the linker.

3.Makefile.am文件编写规则

1.常用的变量
  1. SUBDIRS:SUBDIRS is a special variable listing all directories that make should recurse into before processing the current directory。这个变量一般在项目顶层的Makefile.am文件中定义。
  2. _PROGRAMS结尾的变量:指定编译生成的程序名称
    1. 例如bin_PROGRAMS:表示需要将编译生成的程序安装进bindir
    2. noinst_PROGRAMS:只编译生成目标程序但不进行安装
  3. lib_LIBRARIES:其值为构建链接库的名称,构建好的库会安装到lib目录
  4. lib_LTLIBRARIES:使用libtool工具构建库,其值为库的名称,构建好的库会安装到lib目录
  5. noinst_LTLIBRARIES:使用libtool工具构建库,其值为库的名称,构建好的库不会安装到lib目录
  6. 以dist_为前缀的变量:将列出的文件添加到发行版本中
  7. 以nodist_为前缀的变量:从发行版本中忽略文件
  8. xxx_SOURCES:构建目标xxx需要的源文件,目标可能是库也可能是应用程序。这些源文件都会添加到发行版本中
  9. nodist_xxx_sources:参与构建目标xxx的源文件,不添加到发行版本中
  10. xxx_LDADD:添加其他编译生成的目标文件(例如后缀名为.o的文件)或者库到应用程序中
  11. xxx_LIBADD:添加其他编译后的目标文件(如后缀名为.o的文件)到库中
  12. xxx_CPPFLAGS:指定传递给预处理器的选项
  13. xxx_CFLAGS:指定C编译器的调试和优化选项
  14. xxx_CXXFLAGS:指定C++编译器的调试和优化选项
  15. xxx_LDFLAGS:链接时,给链接器传递的选项
  16. include_HEADERS:构建目标的头文件,这些头文件会安装到include目录
  17. AM_CPPFLAGS:指定传递给预处理器的选项,比如说-I和-D
  18. AM_CXXFLAGS:指定传递给c++编译器的选项
  19. top_srcdir:源码的顶层目录

4.案例

1.示例1
  1. 现有一个小demo autools_test,项目目录如下:
root@hecs-205584:~/autools_test# tree
.
├── AUTHORS
├── ChangeLog
├── func.cpp
├── func.h
├── main.cpp
├── NEWS
└── README

  1. 使用autotools进行项目的构建流程如下(了解):
    1. 执行autoscan对源码文件进行扫描,生成configure.scan和autoscan.log文件。configure.scan文件如下
    #                           -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    # autoconf的版本要求
    AC_PREREQ([2.71])
    AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
    AC_CONFIG_SRCDIR([func.cpp])
    AC_CONFIG_HEADERS([config.h])
    
    # Checks for programs.
    AC_PROG_CXX
    AC_PROG_CC
    
    # Checks for libraries.
    
    # Checks for header files.
    
    # Checks for typedefs, structures, and compiler characteristics.
    
    # Checks for library functions.
    
    AC_OUTPUT
    
    1. 将configure.scan文件进行重命名
    mv configure.scan configure.ac
    
    1. 编辑configure.ac文件
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.71])
    AC_INIT([AutoToolsTest], [0.1.0], [[email protected]])
    AC_CONFIG_SRCDIR([func.cpp])
    AC_CONFIG_HEADERS([config.h])
    
    AM_INIT_AUTOMAKE()
    # Checks for programs.
    AC_PROG_CXX
    AC_PROG_CC
    
    # Checks for libraries.
    
    # Checks for header files.
    
    # Checks for typedefs, structures, and compiler characteristics.
    
    # Checks for library functions.
    AC_CONFIG_FILES([Makefile])
    AC_OUTPUT
    
    
    1. 执行aclocal,将生成aclocal.m4文件、autom4te.cache目录。这个命令依赖configure.ac文件
    2. 执行aotoheader,生成config.h.in文件。这个命令依赖configure.ac文件和aclocal.m4文件
    3. 在项目目录下创建Makefile.am文件,编辑Makefile.am文件
    # 指定可执行程序名称
    bin_PROGRAMS = autotools_test
    autotools_test_SOURCES = main.cpp func.cpp
    
    1. 执行autoconf,生成configure脚本。这个命令依赖configure.ac文件和aclocal.m4文件
    2. 执行automake -a生成Makefile.in文件,这个命令依赖Makefile.am文件
    3. 执行./configure生成Makefile,这个脚本依赖Makefile.in和config.h.in文件
    4. 执行make,编译生成可执行程序autotools_test。这个命令依赖Makefile文件
    5. 运行可执行程序:./autotools_test
  2. 实际项目中,在项目根目录下创建一个脚本,比如说autogen.sh。项目根目录下执行sh autogen.sh就可以生成可执行程序。
# /bin/sh

# --force表示replace existing files
# --automake表示libtool和automake一起使用,有了这个选项,会将libtoolize产生的一些结果放到其他文件中
libtoolize --force --automake

# 删除不必要的输出文件...
rm -f config.log


aclocal
autoheader
autoconf
automake -a

./configure
make -j 4

Libtool

1.简介

  1. 为构建动态库、静态库提供了统一的方式。
  2. 使用Libtool工具构建的库名称一般以la结尾

2.常用参数

  1. -avoid-version:编译生成库的时候不存储版本信息
  2. -module:创建一个库,这个库可以调用dlopen来打开
  3. AM_PROG_LIBTOOL:用于打开共享库

参考:
automake
autoconf
libtool

标签:文件,AC,configure,Makefile,ac,介绍,Libtool,PROG,AutoTools
From: https://www.cnblogs.com/xiaocer/p/17772574.html

相关文章

  • 注册功能, 前端登录注册页面,前端登录功能,前端注册功能, redis介绍和安装
    1注册功能......
  • 关于一款软硬一体的RTSP/Onvif协议视频平台EasyNVR安防视频监控平台的介绍
    EasyNVR是一种网络视频录像机(NetworkVideoRecorder),属于软硬一体的产品,支持RTSP/ONVIF协议接入,体积小巧,通电连网即可成功运行,部署操作简单,低功耗,支持7x24小时不间断运行,省去自建视频服务器的高额费用,专属视频服务,免除了与其他硬件的相互影响,可云端运维。作为一种专业的视频监......
  • 零基础快速上手HarmonyOS ArkTS开发1---运行Hello World、ArkTS开发语言介绍
    概述:在华为开发者大会2023年8月4日(HDC.Together)大会上,HarmonyOS 4正式发布,其实在2021年那会学习了一点鸿蒙的开发:不过因为现在的鸿蒙手机完全兼容Android应用,所以学习动力也不是很足,一直就搁置了,直到今年华为官方出了这么一则消息才让我对于学习它有一种紧迫感了,如下:所以......
  • 计算机中的文本、图片、音频的存储规则介绍
    计算机中的文本、图片、音频的存储规则介绍从一个大的角度来说,计算机中存储的就只有文本和图片还有音频(视频就是图片和音频的集合体),本文旨在对这三种的存储规则做些介绍。在计算机中,任意数据都是以二进制的形式来存储的‍计算机中的文本是怎么进行存储的:什么是二进制?为什么用......
  • 计算机中的文本、图片、音频的存储规则介绍
    计算机中的文本、图片、音频的存储规则介绍从一个大的角度来说,计算机中存储的就只有文本和图片还有音频(视频就是图片和音频的集合体),本文旨在对这三种的存储规则做些介绍。在计算机中,任意数据都是以二进制的形式来存储的‍计算机中的文本是怎么进行存储的:什么是二进制?为什么用......
  • 计算机中的文本、图片、音频的存储规则介绍
    计算机中的文本、图片、音频的存储规则介绍从一个大的角度来说,计算机中存储的就只有文本和图片还有音频(视频就是图片和音频的集合体),本文旨在对这三种的存储规则做些介绍。在计算机中,任意数据都是以二进制的形式来存储的‍计算机中的文本是怎么进行存储的:什么是二进制?为什么用......
  • SpringBoot 缓存之 @Cacheable 详细介绍
    简介缓存介绍Spring从3.1开始就引入了对Cache的支持。定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术。并支持使用JCache(JSR-107)注解简化我们的开发。其使用方法和原理都类似于Spring对事务管理的支持。Sp......
  • redis介绍和安装、redis普通连接和连接池、redis字符串类型、redis hash类型、redis列
    redis介绍和安装#1redis什么-数据库就是个存数据的地方:只是不同数据库数据组织,存放形式不一样-mysql关系型数据库(oracle,sqlserver,postgrasql)-非关系型数据(nosql):redis,mongodb,clickhouse,infludb,elasticsearch,hadoop。。。-没有sql:没有sql语句......
  • Apipost使用介绍
    相信无论是前端,还是后端的测试和开发人员,都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致,导致协作低效、频繁出问题,开发测试人员痛苦不堪。API管理的难点在哪?开发人员在Swagger定义好文档后,接口调试的时候还需要去Postman再定义一遍。前端......
  • Apipost使用介绍
    相信无论是前端,还是后端的测试和开发人员,都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致,导致协作低效、频繁出问题,开发测试人员痛苦不堪。API管理的难点在哪?开发人员在Swagger定义好文档后,接口调试的时候还需要去Postman再定义一遍。前......