• 用automake建立共享库(动态链接库)Makefile


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

    这里用的autoconf是2.67版本,在debian下实现:

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

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

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

    $mkdir rx
    $mkdir rx/src

    在rx/src下编辑rx.c,rx.h两个源文件:

    mybdebian:/home/myb/php/rx/src# cat rx.h
    #ifndef __RX_H_
    #define __RX_H_
    int fun
    ();
    #endif
    mybdebian:
    /home/myb/php/rx/src# cat rx.c
    #include "rx.h"
    int fun
    ()
    {
    return 1234;
    }

    在rx目录和rx/src目录下分别建立Makefile.am文件

    rx目录下的Makefile.am为顶层Makefile.am文件,只要包含其存放源码的子目录即可,内容如下:

    AUTOMAKE_OPTIONS=foreign
    SUBDIRS
    =src

    rx/src目录下的Makefile.am内容如下:

    AUTOMAKE_OPTIONS=foreign
    lib_LTLIBRARIES
    =librx.la
    librx_la_SOURCES
    =rx.c
    include_HEADERS=rx.h

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

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

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

    回到上层目录,使用autoscan扫描源码目录:

    $autoscan
    $ls
    autoscan.log configure.scan Makefile.am src

    把configure.scan改名成为configure.ac

    $mv configure.scan configure.ac
    AC_OUTPUT([Makefile
    src
    /Makefile])

    编译这个文件:

    $vim configure.ac
    # -*- Autoconf -*-
    #
    Process this file with autoconf to produce a configure script.

    AC_PREREQ([
    2.67])
    AC_INIT([FULL
    -PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
    AC_CONFIG_SRCDIR([src
    /rx.c])
    AC_CONFIG_HEADERS([config.h])

    # Checks for programs.
    AC_PROG_CC

    # Checks for libraries.

    # Checks for header files.

    # Checks for typedefs, structures, and compiler characteristics.

    # Checks for library functions.

    AC_CONFIG_FILES([Makefile
    src
    /Makefile])
    AC_OUTPUT

    修改AC_INIT一句,即把包的全名、版本号及BUG报告email地址添上,如:

    AC_INIT(rx2dlib,0.01,resound@163.com)

    在它后面加一句:

    AM_INIT_AUTOMAKE

    这句话是必须的。

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

    # Checks for programs.
    AC_PROG_CC
    AC_PROG_LIBTOOL

    修改后面的那个AC_CONFIG_FILES语句,改成AC_OUTPUT,并把后面的一条AC_OUTPUT去掉:

    AC_OUTPUT([Makefile
    src
    /Makefile])

    这样,configure.ac就建好了,修改后的内容如下:

    # -*- Autoconf -*-
    #
    Process this file with autoconf to produce a configure script.

    AC_PREREQ([
    2.67])
    AC_INIT(rx2dlib,
    0.01,resound@163.com)
    AM_INIT_AUTOMAKE

    AC_CONFIG_SRCDIR([src
    /rx.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])

    然后按顺序执行:

    $aclocal
    $autoconf
    $autoheader
    $libtoolize --automake
    $automake –-add-missing
    configure
    .ac:13: installing `./config.guess'
    configure
    .ac:13: installing `./config.sub'
    configure
    .ac:6: installing `./install-sh'
    configure
    .ac:6: installing `./missing'
    src
    /Makefile.am: installing `./depcomp'

    这时configure脚本已经生成了。

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

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

    $./configure --host=arm-none-linux-gnueabi --prefix=/usr/local/armrx2d

    $make


    Make完成后可以到src目录下面的一个隐藏目录.libs目录中看到生成的库文件:

    mybdebian:/home/myb/php/rx/src/.libs# ls -l
    总计
    20
    -rw-r--r--
    1 root root 2368 04-19 22:48 librx.a
    lrwxrwxrwx
    1 root root 11 04-19 22:48 librx.la -> ../librx.la
    -rw-r--r--
    1 root root 930 04-19 22:48 librx.lai
    lrwxrwxrwx
    1 root root 14 04-19 22:48 librx.so -> librx.so.0.0.0
    lrwxrwxrwx
    1 root root 14 04-19 22:48 librx.so.0 -> librx.so.0.0.0
    -rwxr-xr-x
    1 root root 5422 04-19 22:48 librx.so.0.0.0
    -rw-r--r--
    1 root root 2228 04-19 22:48 rx.o

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

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

    required file `./ltmain.sh' not found

    是因为libtool未配置:

    解决办法:

    $libtoolize --automake --debug --copy –force

    或:

    $libtoolize --automake

  • 相关阅读:
    3组Alpha冲刺5/6
    3组Beta冲刺4/5
    3组Alpha冲刺6/6
    3组Beta冲刺2/5
    3组Beta冲刺3/5
    delegate Demo (一个关于System.Timers.Timer的Demo)
    System.Web.HttpException 与 HTTP Error 404.13 Not Found问题解决说明
    常用SQL关于表的操作
    设计模式学习笔记:单例模式
    JS 实践杂记
  • 原文地址:https://www.cnblogs.com/resound/p/2021681.html
Copyright © 2020-2023  润新知