当前位置:   article > 正文

使用Automake、autoconf、Libtool自动生成Makefile_automake生成动态库

automake生成动态库

命令流程图:

hello例程演示

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目录的Makefile

软件目录结构

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

生成shallow 目录结构的Makefile

把所有的文件放到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,否则修改会被覆盖掉

使用Libtool构建动态链接库

示例:

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

使用libtool+automake将模块编译成动态库

修改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

deep目录结构的Makefile

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/662132
推荐阅读
  

闽ICP备14008679号