技术专栏
Autotools自动生成Makefile
Autotools自动生成Makefile
Autotools
•系列工具包:Autoconf、Automake、Libtool
•工具安装
•检测系统是否已经安装:which autoconf
•自动安装:apt install autoconf automake libtool
•需要依赖的包:m4\perl\autotools-dev\autoconf-archive\gnu-standards\ autobook …
•手动安装:
»下载对应.tar.gz源码包;解压tar xvf *.tar.gz
»编译:./configure;make;make install
Autotools自动创建Makefile流程
•生成Makefile的通用规则文件Makefile.in
•(1)手工编写Makefile.am文件
•(2)#automake:将Makefile.am-àMakefile.in
•生成配置脚本configure
•(1)#autoscan:生成configure.scanàconfigure.ac
•(2)修改、配置configure.ac
•(3)#aclocal:生成aclocal.m4,存放autoconf运行需要的宏
•(4)#autoconf:将configure.acàconfigure
•通过configure生成Makefile
•(1)#./configure:Makefile.inàMakefile
•(2)#make;make install
示例:
- 1、 在autotools下创建hello.c
- 2、 用autoscan生成configure.scan
- 3、 mv configure.scan configure.ac
- 4、 修改configure.ac
1 # -*- Autoconf -*-
2 # Process this file with autoconf to produce a configure script.
3
4 AC_PREREQ([2.69])
5 AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) //FULL-PACKAGE-NAME 为软件包名,
6 AC_CONFIG_SRCDIR([hello.c])
7 AC_CONFIG_HEADERS([config.h])
8
9 # Checks for programs.
10 AC_PROG_CC
11
12 # Checks for libraries.
13
14 # Checks for header files.
15
16 # Checks for typedefs, structures, and compiler characteristics.
17
18 # Checks for library functions.
19
20 AC_OUTPUT
1 # -*- Autoconf -*-
2 # Process this file with autoconf to produce a configure script.
3
4 AC_PREREQ([2.69])
5 AC_INIT(hello, 1.0, mail.original.com)
6 AC_CONFIG_SRCDIR([hello.c])
7 AC_CONFIG_HEADERS([config.h])
8 AM_INIT_AUTOMAKE //使用Automake编译
9
10 # Checks for programs.
11 AC_PROG_CC
12
13 # Checks for libraries.
14
15 # Checks for header files.
16
17 # Checks for typedefs, structures, and compiler characteristics.
18
19 # Checks for library functions.
20
21 AC_OUTPUT(Makefile) //指定输出文件 Makefiel
22
23
- 5、 aclocal:生成aclocal.m4,存放autoconf运行需要的宏
- 6、 autoconf:将configure.ac->configure
7、 创建 Makefile.am
8 autoheader 生成配置文件
- 9、 automake —add-missing(-a) 生成隐式配置
- 10、 编译
./configure
make
make install
make uninstall
工具的发展史
linux发行版
使用Autotools宏、变量配置flat目录的Makefile
软件目录结构
Flat
所有的文件都存放在同一个目录下
Shallow
主程序源文件放在顶层目录中
各个模块文件放在各个子目录中
Deep
所有源文件都存放在各个子目录中
Makefile.am语法
- 主要有宏、变量组成
- 各个变量定义生成需要被编译、链接的目标、依赖源文件、要安装的目录等
- 工具automake根据这些目标和源文件添加规则,生成makefile.in
- 少量的makefile语法、注释等
- 在makefile.am定义的makefile代码将被添加到makefile.in的合适位置
- 注释使用##表示,不会被输出到Makefile.in
Automake的宏、变量
文件编译类型 | 说明 |
---|---|
_PROGRAMS | 表示生成目标是可执行文件 |
_LIBRARIES | 生成目标为库文件 |
_LTLIBRARIES | 使用LIBTOOL生成库文件 |
_HEADERS | 头文件 |
_DATA | 数据文件、配置文件等 |
数据文件、配置文件等 | 值 |
---|---|
bindir | $(prefix)/bin |
libdir | $(prefix)/lib |
datadir | $(prefix)/share |
sysconfdir | $(prefix)/etc |
includedir | $(prefix)/include |
$(top_srcdir) | 工程顶层目录 |
$(top_builddir) | 目标文件顶层目录 |
noinst | 不安装 |
编译配置 | 说明 |
---|---|
_SOURCES | 目标依赖的源文件 |
_LIBADD | 生成库时需要链接的其它库 |
_LDADD | 链接需要链接的库 |
_LDFLAGS | 链接选项:-I /-L/-shared/-fPIC |
_LIBTOOLFLAGS | Libtool编译选项 |
其它变量 | 说明 |
---|---|
INCLUDES | 链接所需头文件 |
SUBDIRS | 递归处理子目录 |
EXTRA_DIST | 打包文件或目录 |
Makfile.am示例
Configure.ac文件语法
宏 | 说明 | 备注 |
---|---|---|
AC_INI | 一般以此开头 | AC_INIT |
AC_PROG_CC | 检测C编译器,C项目需要设置此宏 | 检查编译器 |
AC_CONFIG_SRC_DIR | 项目源文件 | 检测函数库 |
AC_CONFIG_HEADERS | 配置头文件 | 检查头文件 |
AC_CHECK_LIB | 检测lib库中是否有指定函数 | 检查函数定义类型 |
AC_PROG_LIBTOOL | 使用libtool生成动态共享库 | |
AC_PROG_RANLIB | 静态库 | |
AC_OUTPUT | 设置configure输出的Makefile文件 | |
AC_CONFIG_FILES([Makefile]) | 用于生成相应的Makefile | |
AM_INIT_AUTOMAKE | 运行Automake必需的宏 | |
dnl或# | 注释标志 |
Shallow目录架构的Makefile
shallow目录结构
在当前目录下做编译配置,会生成大量的配置文件,和原代码混合在一起,会十分混乱,所以新建一级src目录,使原码树保持整洁。
流程:
- 通过autoscan生成配置脚本
- mv configure.scan configure.ac
- 修改配置文件 vim configure.ac
改为:
添加生成静态库的宏: - aclocal生成m4宏:
- 生成头文件autoheader:
- autoconf 生成 configure脚本
- 编写的Makfile.am
根目录下的Makfile.am
src目录下的Makefile.am
usb下的Makefile.am
lcd下的Makefile.am
media下的Makefile.am - 生成依赖automake -a:
- 生成makefile ./configure:
- 编译 make:
头文件管理及路径指定
为了方便头文件的引用,把头文件放入指定的目录
# 修改src下的Makefile.am指定头文件路径:
- 老版本的INCLUDES宏指定:
警告:
- 新版本的
打包软件包时怎么包含inc头文件目录
- 在inc下编写Makefile.am
- 在src下的主Makefile.am增加inc路径
- 在根上路的Makefile.am中指定要inc下生成makefile
- 重新配置 aclocal、 autoconf automake
- ./configure
- make
- make dist
确定头文件与C文件的依赖关系
gcc -MM play.c
查看依赖的头文件- 在Makefile.am中添加头文件的依赖
构建目标文件
Automake 没有定义目标文件的宏与变量,可以通编译原理来生成目标文件
- automake后手动修改Makfile.am
修改
src/Makefile.am
automake、./configure 后修改
lcd/Makefile.in
- automake后手动修改Makfile.am
- 修改
src/Makefile.am
- 修改
src/usb/Makefile.am
./configure
后手动修改src/usb/Makefile.in
使用Libtool构建动态链接库
Libtool简介
- 不同Unix平台,共享库的编译、命名、管理方式不相同
- 库的命名:.so/.a/.sa/.o
- 有的平台支持动态加载、有的平台提供其它机制、有的不提供
- Libtool对库进行抽象,生成.la形式,支持不同平台
Libtool包
- 包含libtool和libtoolize两个工具
- 使用libtool之前,先使用libtoolize,生成本地化的libtool
Libtool的选项
—tag选项
语言 | Tag名称 | 备注 |
---|---|---|
C | CC | |
C++ | CXX | |
JAVA | GCJ | |
Go | GO | |
Fortran | FC | |
Fortran 77 | F77 |
—mode选项
—mode选项 | 说明 | 备注 |
---|---|---|
compile | 将一个源文件编译为Libtool目标文件 | |
link | 生成一个库或者可执行文件 | |
install | 安装一个库或可执行文件 | |
execute | 运行可执行文件,并自动设置库路径 | |
uninstall | 卸载库 | |
clean | 从编译目录清楚生成的文件 | |
finish | 完成Libtool库文件的安装 |
linux平台下动库的编译
编译目标文件
gcc -o jpg.o -c -fPIC jpg.c
生成动态库
gcc -o libjpg.so -shared jpg.o
libtool 的使用
libtool —help
original@192:/work/autotools/jpg$ libtool --help
Usage: libtool [OPTION]... [MODE-ARG]...
Provide generalized library-building support services.
--config show all configuration variables
--debug enable verbose shell tracing
-n, --dry-run display commands without modifying any files
--features display basic configuration information and exit
--mode=MODE use operation mode MODE
--preserve-dup-deps don't remove duplicate dependency libraries
--quiet, --silent don't print informational messages
--no-quiet, --no-silent
print informational messages (default)
--no-warn don't display warning messages
--tag=TAG use configuration variables from tag TAG
-v, --verbose print more informational messages than default
--no-verbose don't print the extra informational messages
--version print version information
-h, --help, --help-all print short, long, or detailed help message
MODE must be one of the following:
clean remove files from the build directory
compile compile a source file into a libtool object
execute automatically set library path, then run a program
finish complete the installation of libtool libraries
install install libraries or executables
link create a library or an executable
uninstall remove libraries from an installed directory
MODE-ARGS vary depending on the MODE. When passed as first option,
`--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
Try `libtool --help --mode=MODE' for a more detailed description of MODE.
When reporting a bug, please describe a test case to reproduce it and
include the following information:
host-triplet: x86_64-redhat-linux-gnu
shell: /bin/sh
compiler: gcc
compiler flags: -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC
linker: /usr/bin/ld -m elf_x86_64 (gnu? yes)
libtool: (GNU libtool) 2.4.2
automake: automake (GNU automake) 1.13.4
autoconf: autoconf (GNU Autoconf) 2.69
Report bugs to <bug-libtool@gnu.org>.
GNU libtool home page: <http://www.gnu.org/software/libtool/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
original@192:/work/autotools/jpg$
示例
使用libtool编译库文件
libtool --tag=CC --mode=compile gcc -o jpg.lo -c jpg.c
libtool --tag=CC --mode=link gcc -o libjpg.la -c jpg.lo
使用libtool编译可执行文件
libtool --tag=CC --mode=compile gcc -I./ -c hello.c
libtool --tag=CC --mode=link gcc -o hello hello.lo ./libjpg.la
sudo libtool --mode=install install -c hello /usr/local/bin/
sudo libtool --mode=uninstall rm /usr/local/bin/hello
autoconf、automake 与 libtool 配合使用
- 编写Makefile.am
- 生成配置脚本
- autoscan
- mv configure.scan configure.ac
- vim configure.ac
- aclocal
- autoconf
- libtoolize —automake —copy —debug —force //告诉automake 与 libtool 配合使用
- automake -a
- ./configure
以mp3
工程为例:
修改configure.ac
修改src/lcd/Makefile.am
修改src/usb/Makefile.am
修改src/Makefile.am
修改src/inc/Makefile.am
autoconf
autoheader
libtoolize --automake --copy --debug --force
aclocal
automake -a
./configure
编译结果:
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
3
2
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据
相关专栏
-
浏览量:12101次2020-12-15 19:07:24
-
浏览量:980次2023-09-28 09:47:44
-
浏览量:825次2023-02-15 22:48:47
-
浏览量:1771次2017-11-24 11:18:08
-
浏览量:4235次2020-09-23 19:01:05
-
浏览量:7600次2020-11-16 15:46:54
-
浏览量:692次2024-02-21 15:24:33
-
浏览量:1742次2018-02-25 23:35:56
-
浏览量:10675次2021-01-21 11:07:14
-
浏览量:546次2023-08-09 11:11:13
-
浏览量:3581次2020-01-10 09:30:20
-
浏览量:4710次2022-03-30 09:00:15
-
浏览量:2683次2023-03-17 10:25:53
-
浏览量:2649次2020-09-30 10:12:42
-
浏览量:1768次2020-09-16 19:28:28
-
浏览量:6187次2022-10-24 14:44:33
-
浏览量:116次2023-08-30 20:27:59
-
浏览量:1515次2020-02-18 12:23:42
-
浏览量:1795次2020-07-10 14:00:25
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
Hilbert
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注