使用automake工具包建立一个交叉编译的共享库的Makefile

需要automake, 可以用apt-get install automake来装最新的版本,还需要libtool,也需要用apt-get install来安装。

这里建立一个简单的函数库来介绍:

建立目录hello_world,及源码目录src:

root@ubuntu:~/c_demo/automake/libso# tree
.
└── hello_world
    ├── configure.ac
    ├── Makefile.am
    └── src
        ├── hello.c
        ├── hello.h
        └── Makefile.am

2 directories, 5 files
  • 1. 在hello_world目录下建立Makefile.am,其为顶层Makefile.am文件,只要包含其存放源码的子目录即可,内容如下:
    AUTOMAKE_OPTIONS=foreign
    SUBDIRS=src
    
  • 2. 在hello_world/src目录下建立Makefile.am, 内容如下:
    AUTOMAKE_OPTIONS=foreign
    lib_LTLIBRARIES=libhello.la
    libhello_la_SOURCES=hello.c
    include_HEADERS=hello.h
    

    其中lib_LTLIBRARIES=后面的“libhello.la”为要生成的库文件名,必须写成.la,不能是.so,实际会生成libhello.so文件。

    下面的libhello_la是libhello.la把“.”换成下划线“_”后面加上“_SOURCES=”,等号以后为源文件名称,多于一个时用空格隔开。

    include_HEADERS=后面的为头文件,是供其它程序包含用的,make install时会复制到安装目录的include 目录中。

  • 3. 回到hello_world目录,使用autoscan扫描源码目录:
  • 4. 把configure.scan改名成为configure.ac, 并编辑如下:
    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.67])
    AC_INIT(hellodlib,0.01,sunlrain02@gmail.com)
    AM_INIT_AUTOMAKE
    
    AC_CONFIG_SRCDIR([src/hello.c])
    AC_CONFIG_HEADERS([config.h])
    
    # Checks for programs.
    AC_PROG_CC
    AC_PROG_LIBTOOL
    
    # Checks for libraries.
    
    # Checks for header files.
    
    # Checks for typedefs, structures, and compiler characteristics.
    
    # Checks for library functions.
    
    AC_OUTPUT([Makefile src/Makefile])
    

    AM_INIT_AUTOMAKE 是必须的
    由于这个脚本是用于生成共享库的,所以要加一句AC_PROG_LIBTOOL在AC_PROG_CC的下一行

  • 5. 然后按顺序执行:
    $aclocal
    $autoconf
    $autoheader
    $libtoolize --automake
    $automake –-add-missing
    

    这时configure脚本已经生成了。

    可以用它来配置生成Makefile了。

    如我们要生成交叉编译给ARM CPU使用的共享库,这里假设我们要使用的编译器为arm-none-linux-gnueabi-gcc,并且我们最终在ARM板上执行时,要把库安装到目标板的/usr/local/armrx2d目录中去。可以这样配置:

    $./configure  --host=arm-none-linux-gnueabi --prefix=/usr/local/armrx2d
    $make
    
  • 6. Make完成后可以到src目录下面的一个隐藏目录.libs目录中看到生成的库文件:
    root@ubuntu:~/c_demo/automake/libso/hello_world/src/.libs# ls -al
    total 32
    drwxr-xr-x 2 root root 4096 Oct  6 17:50 .
    drwxr-xr-x 4 root root 4096 Oct  6 17:50 ..
    -rw-r--r-- 1 root root 2544 Oct  6 17:50 hello.o
    -rw-r--r-- 1 root root 2676 Oct  6 17:50 libhello.a
    lrwxrwxrwx 1 root root   14 Oct  6 17:50 libhello.la -> ../libhello.la
    -rw-r--r-- 1 root root  938 Oct  6 17:50 libhello.lai
    lrwxrwxrwx 1 root root   17 Oct  6 17:50 libhello.so -> libhello.so.0.0.0
    lrwxrwxrwx 1 root root   17 Oct  6 17:50 libhello.so.0 -> libhello.so.0.0.0
    -rwxr-xr-x 1 root root 8312 Oct  6 17:50 libhello.so.0.0.0
    

    我们再回到顶层目录,执行make install可以自动安装生成的库到/usr/local/armrx2d/lib目录下。

注意

若使用automake时出现下面错误信息

required file `./ltmain.sh’ not found

是因为libtool未配置:

解决办法:

$libtoolize –automake –debug –copy –force

或:

$libtoolize –automake

分类: Makefile

发表评论

电子邮件地址不会被公开。 必填项已用*标注