AutoMake构建
环境工具:autoconf、automake、make
1、执行autoscan命令生成autoscan.log和configure.scan文件
2、mv configure.scan configure.ac且修改configure.ac(早期使用configure.in),这里要修改configure.ac
3、使用aclocal生成aclocal.m4文件
4、执行autoconf命令生成configure文件
5、执行autoheader命令生成config.h和config.h.in
6、创建一个Makefile.am文件
7、touch NEWS README AUTHORS ChangeLog
8、执行 automake --add-missing ,Automake 会根据 Makefile.am 文件产生一些文件,包含最重要的Makefile.in
9、执行./configure 命令生成Makefile文件
文件configure.ac
-*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.68])
AC_INIT(hello, 1.0,[email])
AM_INIT_AUTOMAKE(hello, 1.0)
AC_CONFIG_SRCDIR([hello.c]) #用于检测源码目录的有效性,任选一个源码文件即可
AC_CONFIG_HEADERS([config.h]) #用于生成config.h文件,以便autoheader使用
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
#LT_INIT #编译libtool必须添加的两行,这里直接编译成so,故不需要
#AC_PROG_LIBTOOL
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile ]) #需要生成的所有Makefile
AC_OUTPUT
Makefile.am
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c
在上面产生的中间文件中,开发者需要设置的有configure.ac和Makefile.am,下面介绍这两个文件中常用宏的意义。
configure.ac文件:autoconf 是用来产生 'configure'文件的工具。'configure' 是一个 shell script,它可以自动设定一些编译参数使程序能够条件编译以符合各种不同平台的 Unix 系统。autoconf 会读取 configure.ac文件然后产生'configure' 这个shell script。configure.ac文件内容是一系列 GNU m4 的宏,这些宏经 autoconf 处理后会变成检查系统特性的 shell scripts。configure.ac文件中宏的顺序并没有特别的规定,但是每一个 configure.in 文件必须在所有其它宏前加入 AC_INIT宏,然后在所有其它宏的最后加上 AC_OUTPUT 宏。常用到的宏如下:
dnl和#:这个宏后面的内容不会被处理,可以视为注释
AC_INIT(FILE):该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION):这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件的名称,VERSION 是版本编号。一般autoscan不会产生,需要手动添加
AC_PROG_CC:检查系统可用的 C 编译器,若源代码是用 C 写的就需要这个宏。
AC_OUTPUT(FILE):设置 configure 所要产生的文件,若是 Makefile ,configure 便会把它检查出来的结果填充到 Makefile.ac文件后产生合适的 Makefile。
实际上,在使用 automake 时,还需要一些其他的宏,这些额外的宏我们用 aclocal 来帮助产生。执行 aclocal 会产生 aclocal.m4 文件,如果没有特别的用途,不需要修改它,用 aclocal 所产生的宏会告诉 automake 如何动作。有了 configure.ac 及 aclocal.m4 两个文件以后,便可以执行 autoconf 来产生configure 文件了.
Makefile.am 文件:Automake 会根据 configure.ac 中的宏并在 perl 的帮助下把 Makefile.am 转成 Makefile.in 文件。Makefile.am 文件定义所要产生的目标,下面一张图中,列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件的一般规则:
整个Makefile.am就是按照上面三个表格来编写的,不管是编写可执行文件还是动态库。对照着上面的表格,来解释我们hello程序的Makefile.am:
AUTOMAKE_OPTIONS:设置 Automake 的选项。Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行 Automake 时 ,会检查目录下是否存在标准 GNU 软件中应具备的文件,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件。设置为 foreign 时,Automake 会改用一般软件的标准来检查,此时不需要这些文件
bin_PROGRAMS:定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空白符隔开。
hello_SOURCES:定义 'hello' 这个执行程序所需要的原始文件。如果 'hello'这个程序是由多个原始文件所产生,必須把它所用到的所有原始文件都列出来,以空白符隔开。假设 'hello' 还需要 'hello.c'、'main.c'、'hello.h' 三个文件的话,则定义hello_SOURCES= hello.c main.c hello.h。如果定义多个执行文件,则对每个执行程序都要定义相对的 filename_SOURCES。
LDADD:一般用于指明本项目自己生成的库,而LDFLAGS一般使用-l等指明本项目依赖的第三方库,如opencv库。另外由于一个Makefile.am中可能会生成多个动态库、可执行文件等,所以如果使用LDADD,则是为所有的库或者执行文件指定依赖库,如果使用hello_LDADD则是为hello应用程序指定依赖库,类似于全局变量和局部变量的关系
aclocal,autoheader,autoconf,automake --add-missing
./configure
make
libtool
libtool命令的主要作用是创建和使用可移植的共享(动态链接)库。
其他相关命令
ifnames 命令可以列出程序中的预处理标示符,比如#if,#ifdef等。
m4 处理文件中的宏。
pkg-config 查询已安装库的接口。
AutoMake构建相关推荐
- C实战:项目构建Make,Automake,CMake
C实战:项目构建Make,Automake,CMake 在本系列文章<C实战:强大的程序调试工具GDB>中我们简要学习了流行的调试工具GDB的使用方法.本文继续"C实战" ...
- Linux下automake应用
Linux下automake应用 linux 环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用 make 工具,自动进行编译安装,但是手写 makefile 文件比较复杂,所幸在 GN ...
- OpenCASCADE:环境变量
OpenCASCADE:环境变量 OpenCASCADE:环境变量 在 Windows 上 在 Unix 上 OpenCASCADE:环境变量 要运行任何 Open CASCADE Technolog ...
- Open CASCADE 介绍
目录 概览 基础类 建模数据 建模算法 Mesh 可视化 数据交换 形状修复 应用程序框架 绘制测试线束 要求 第三方库和工具 硬件 下载与安装 Windows 欢迎使用开放式CASCADE技术(OC ...
- Sofia-SIP模块开发指南
源文出处http://sofia-sip.sourceforge.net/refdocs/programming.html 编程指南 编写可移植代码 Sofia-SIP软件代码大部分都是可移植的.所有 ...
- C语言----项目构建Make,Automake,CMake
http://blog.csdn.net/dc_726/article/details/48978849
- Dockerfile构建实践
Dockerfile构建实践 本文介绍了用于构建有效图像的推荐最佳实践和方法. Docker通过从一个Dockerfile文本文件中读取指令来自动构建映像,该文本文件按顺序包含构建给定映像所需的所有命 ...
- Scons构建C++项目
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/08/30/scons/ 前言 我是一个 linux c++ 开发者,但是一直对 Makefile 的语法很是头痛,每 ...
- xmake入门,构建项目原来可以如此简单
为什么80%的码农都做不了架构师?>>> 前言 在开发xmake之前,我一直在使用gnumake/makefile来维护个人C/C++项目,一开始还好,然而等项目越来越庞大后, ...
最新文章
- [转]带宽计算-大B与小b的区别
- 洛谷 P3112 [USACO14DEC]后卫马克Guard Mark
- 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
- C++vector容器学习
- Linux中 oracle SQL*PLUS 命令大全
- 机器学习-集成学习-提升树-Xgboost
- javafx 示例_JavaFX列表示例
- redis 判断存在性_springboot + redis + 注解 + 拦截器 实现接口幂等性校验
- DT大数据梦工厂 第55,56讲
- 【Gym-101889 D】Daunting device【分块】
- [原创]Android秒杀倒计时自定义TextView
- 01数据结构概述(郝斌数据结构)
- 安卓手机利用DroidCam当电脑摄像头使用方法
- Unity ProjectTiny用纯ECS写个跃动的小球
- 速卖通韩国下载量再次登顶,7500万投资换来回报
- 计算机x线摄影的发展趋势,计算机X线摄影技术----CR 新进展
- 圆桌会回顾 | SecureBoost:挑战千万级别样本训练之性能提升篇
- Compuware Softice的烦恼
- python技术线上培训
- 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
热门文章
- 2012年第三届蓝桥杯C组 day11
- 震惊!居然还有人不懂二叉树!99%的程序员都会了,不会就点进来吧!
- JAVA JDBC 增删改查简单例子
- 常见Mysql的慢查询优化方式
- LWIP应用开发|TCP状态机
- 搭建部署zabbix监控客户端Linux系统
- 实验06 组件图部署图和包图
- javaw.exe中的“w”是代表什么,有什么用
- [C语言]栈和队列的输入输出
- es启动bound or publishing to a non-loopback address,enforcing bootstrap checks bootstrap checks failed