赞
踩
命令流程图:
1.创建一个hello.c文件:
1 include <stdio.h> 2 void main() 3 { 4 printf("hello world\r\n"); 5 return 0; 6 } |
执行autoscan自动生成autoscan.log configure.scan
将configure.scan重命名为configure.ac并按如下图形式修改:
执行aclocal,生成aclocal.m4,存放autoconf运行需要的宏
执行autoconf,生成configure,autoconf就是通过configure.ac中的宏就行配置的
编写Makefile.am文件
AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=mp3 mp3_SOURCES=hello.c |
[root@localhost chap4]# autoheader
[root@localhost chap4]# automake --add-missing 或automake -a
注意:不能放在Windows的共享文件夹下,否则此步会报如下错误:
configure: error: cannot find install-sh, install.sh, or shtool in "." "./.." "./../.." [root@localhost chap4]# automake -a configure.ac:8: error: installing './install-sh'; error while making link: Operation not supported configure.ac:8: error: installing './missing'; error while making link: Operation not supported Makefile.am: error: installing './INSTALL'; error while making link: Operation not supported Makefile.am: error: required file './NEWS' not found Makefile.am: error: required file './README' not found Makefile.am: error: required file './AUTHORS' not found Makefile.am: error: required file './ChangeLog' not found Makefile.am: error: installing './COPYING' using GNU General Public License v3 file; error while making link: Operation not supported Makefile.am: Consider adding the COPYING file to the version control system Makefile.am: for your code, to avoid questions about which license your project uses Makefile.am: error: installing './depcomp'; error while making link: Operation not supported |
放到Linux系统下的目录下后,以上问题解决,但是还会报以下错误:
configure.ac:8: installing './install-sh' configure.ac:8: installing './missing' Makefile.am: installing './INSTALL' Makefile.am: error: required file './NEWS' not found Makefile.am: error: required file './README' not found Makefile.am: error: required file './AUTHORS' not found Makefile.am: error: required file './ChangeLog' not found Makefile.am: installing './COPYING' using GNU General Public License v3 file Makefile.am: Consider adding the COPYING file to the version control system Makefile.am: for your code, to avoid questions about which license your project uses Makefile.am: installing './depcomp' |
提示找不到NEWS,README,AUTHORS,ChangeLog这些文件,手动添加后,重新执行automake –a
#./configure
#./make
make install 安装
make uninstall卸载
软件目录结构
Flat
• 所有的文件都存放在同一个目录下
Shallow
• 主程序源文件放在顶层目录中
• 各个模块文件放在各个子目录中
Deep
• 所有源文件都存放在各个子目录中
Automake的宏、变量
Makefile.am示例
make prefix=/opt/…
配置安装路径
操作步骤:
1.编写Makefile.am
2.执行.autoscan自动生成configure.scan,重命名为configure.ac并行configure.ac中的配置.
再依次执行以下命令即可
aclocal autoconf autoheader automake –a ./configure make |
把所有的文件放到src目录下,目录结构如下图所示:
执行autoscan命令自动扫描,生成configure.scan,重命名为configure.ac,并修改为:
在src上层目录下编写Makefile.am
在src目录下编写Makefile.am
在usb目录下编写Makefile.am
将usb目录下的Makefile.am复制到其他几个子目录下进行适当的修改后,返回src上层目录,执行aclocal\autoconf\autoheader\automake-a\./configure 即可生成Makefile
这里包含头文件的时候要使用相对路径。
把头文件都统一放到inc目录下:
源文件中包含头文件时就不需要再添加相对路径了
src目录下的Makefile.am修改为:
返回上层目录,重新执行automake –a
提示:src/Makefile.am:6: warning: 'INCLUDES' is the old name for 'AM_CPPFLAGS' (or '*_CPPFLAGS')
可把src目录下的Makefile.am修改为:
各个模块子目录下的Makefile.am中添加*_CFLAGS配置,当包含的头文件被修改后会被重新编译
执行autoconf \ automake –a 、./configure 即可生成Makefile
但是,当使用make dist命令进行打包的时候,不会把头文件一起打包进去,解压出来后使用./configure \ make时就会报错找不到头文件,这是因为头文件并没有添加到自动规则里面。
[root@localhost shallow_dir]# make dist |
tar -xvf mp3-1.2.tar.gz |
为了解决以上问题,需在头文件目录下也创建一个Makefile.am
src下的Makefile修改:
主目录下的configure.ac修改:
重新autoconf \ automake –a \ ./configure \ make 即可
再使用makedist打包后再解压后看到头文件也包含进来了
执行./configure \ make可生成可执行文件。
使用make install会把应用程序默认安装在/usr/local/bin下。
如果想把头文件也安装到系统下(/usr/local/include)
头文件目录inc下的Makefile.am改为
重新编译安装后,会把头文件也安装到/usr/local/include下
一般静态库的头文件不需要安装到系统中,所以使用noinst
以上都是将各个模块编译成库文件,有时我们不需要将模块编译成库文件,只要生成.o目标文件,但是automake并没有定义编译成文件的变量,这种情况下,也可以通过欺骗automake的方法来实现。
程序的编译链接过程
• 欺骗”Automake”工作,生成Makefile.in,编译出.o文件
• 修改Makefile.in的link规则:把link删掉
• 发布Makefile.in
示例:
修改lcd模块,只生成.o文件,不生成库文件
(1)修改lcd模块中的Makefile.in文件,只生成.o文件
(2)回到主目录
./configure (这里就不能再使用automake,否则修改过的Makefile.in又会被覆盖掉)
make clean
make
tree src
需要再修改src目录下的Makefile.am
重新automake -a,这是lcd模块下修改过的Makefile.in被覆盖掉了,需重新改成
./configure
make clean
make
tree src
同样也可以生成可执行文件mp3
也可以将模块修改为一个可执行程序,将lcd/Makefile.am修改为如下:
src/Makefile.am修改为:
lcd/Makefile.in
./configure
make clean
make
tree src
这种修改规则后,发布之后不能再进行automake –a,否则修改会被覆盖掉
示例:
media.c media.h
常规动态库生成方法:
编译成一个与位置无关的目标文件:
gcc -fPIC -o media.o -c media.c
生成一个动态库
gcc -shared -o libmedia.so media.o
使用libtool生成动态库,以gcc编译类似:
libtool –help查看帮助
*.lo: 目标文件 *.la:库文件
libtool --tag=CC --mode=compile gcc -o media.lo -c media.c
libtool --tag=CC --mode=link gcc -o libmedia.la media.lo
动态库的使用
编辑测试程序test.c
编译:libtool --tag=CC --mode=compile gcc -I./ -c test.c
链接:libtool --tag=CC --mode=link gcc -o test test.lo ./libmedia.la
安装:libtool --tag=CC --mode=install install -C test /usr/local/bin/
卸载:libtool --tag=CC --mode=uninstall rm /usr/local/bin/test
与automake结合使用
编写Makefile.am
注意:这里是lib_LTLIBRARIES 不是lib_LIBRARIES,后缀名是.la
aclocal
autoconf
autoheader
libtoolize --automake
automake –a
./configure
make
make install
修改coufigure.ac
src/lcd/Makefile.am
src/Makefile.am
src/inc/Makefile.am
autoconf
autoheader
libtoolize --automake
automake –a
./configure
make
make install
一般/usr/local不在系统路径里面,需要手动添加到系统变量里
在/etc/ld.so.conf.d/i386-linux-gnu.conf中添加/usr/local/lib路径
ldconfig
编写编译一个静态库
gcc -o video.o -c video.c
ar rcs -o libvideo.a video.o
把头文件放到src/inc下,在src下建一个lib目录用来放第三方库文件
在player.c这调用库文件
在src/Makefile.am中添加库文件:
src/inc/Makefile.am添加头文件
automake –a
./configure
make
先把第三方动态库安装到系统
src/Makefile.am添加动态库名称
在player.c这调用库文件
automake -a
./configure
make
make install
ldconfig
src/Makefile.am
app/Makefile.am
configure.ac
autoconf
autoheader
libtoolize --automake
automake –a
./configure
make
make install
make dist
测试:
解压tar xvf mp3-1.2.tar.gz
./configure
make 报错
发现lib目录并没有被打包。
到src/Makefile.am文件下添加打包变量EXTRA_DIST手动添加
重新 automake –a \ ./configure \make
重新打包make dist 就可以了
一般软件还会有软件说明。在src同级目录下创建一个doc目录。在doc目录下创建一个README.txt。
在主目录Makefile.am中添加手动打包目录doc
重新打包make dist
指定某个文件是否打包
安装目录_文件编译类型=编译目标
• 在之前添加dist表示打包
• 在之前添加nodist表示不打包
示例
• bin_PROGRAMS = mp3
• nodist_mp3_SOURCES = player.c
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。