要使用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

用automake建立共享库(动态链接库)Makefile相关推荐

  1. linux添加自己的库,Linux学习笔记——例叙makefile 增加自定义共享库

    Linux学习笔记--例说makefile 增加自定义共享库 0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己 ...

  2. linux中安装,编译时调用,运行时调用,更新共享库

    一 创建并编译共享库 动态链接库一般以lib开头,形如libmymodule.so.1.0.0. 后面跟的三个版本号,从左到右的含义为: (1) 大版本号,当接口变得和之前不兼容,则新增一个大版本号. ...

  3. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客

    Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客 Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf     (2009-07- ...

  4. 静态库与动态库(共享库)的联系与区别

    提要: 1.静态库                 静态库,也称作归档库(archive),按惯例它们的文件名都以.a结尾.比如,标准C语言函数库/usr/lib/libc.a和X11函数库/usr/ ...

  5. was设置共享库解决jar冲突

    一.jar包冲突问题解决 1.问题描述: 引入新外围项目的jar后,在本地tomcat运行正常,但是在was服务器调用httpclient.jar中方法提示异常(该异常为系统异常,Java代码的try ...

  6. Android .so 共享库(动态链接库)

    转载自:http://blog.csdn.net/bat603/article/details/1438408 烟雨楼 http://hi.baidu.com/yanyulou c2]$ ar -r ...

  7. linux建立动态库链接,Linux动态链接库.so文件的创建与使用

    资料出处:http://linux.chinaitlab.com/administer/803560.html 编 写维护文件的目的,在于方便程序员维护程序,尤其是维护比较大的工程项目.一个素质良好的 ...

  8. 【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库

    前言 不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个 ...

  9. linux 生成和使用动态链接库和静态链接库的Makefile编写

    引用 Jesse Rei 的 linux 生成和使用动态链接库和静态链接库的Makefile编写 生成和使用动态链接库和静态链接库的Makefile编写 1. 概述 介绍linux下生成和使用动态链接 ...

  10. Linux C++ libdl.so dlfcn.h使用方法(dlopen()、dlsym()、dlclose()、dlerror())(用于动态链接库操作)(懒加载、立即加载)共享库符号、动态库

    文章目录 dlfcn.h解析 - dlopen():打开一个动态链接库文件并返回一个句柄,该句柄用于后续的操作,如查找符号.关闭库等. - dlsym():在打开的动态链接库中查找指定的符号,并返回符 ...

最新文章

  1. k8s实战之数据卷(volume)
  2. 【Python】精选30张炫酷的动态交互式图表,Pandas一键生成,通俗易懂
  3. iOS五种本地缓存数据方式
  4. 非科班通过几个月的培训入行人工智能现实吗?
  5. 零c语言txt下载,C语言问题c-0是什么意思
  6. Windows Nano Server安装配置详解03:远程管理Nano Server
  7. linux和python的关系_Python、Linux与我的缘分
  8. python3.7.2安装与配置_python3.7.0 安装与配置
  9. java因子的计算方法是_JAVA分解质因子
  10. 二维数组各行求和_数组入门 | 数组的维度和尺寸
  11. 2021江苏淮安高考成绩查询,2021江苏公务员考试成绩查询入口(淮安)
  12. 汉生机器人_2019高工机器人核心零部件会议
  13. ppt 2016 html,2016第1章HTML5.ppt
  14. 标准c++读写ini文件类
  15. Firemonkey Control的TabStop处理
  16. vue 点击按钮改变颜色
  17. 最全常见Web安全漏洞总结及推荐解决方案
  18. 高等数学期末总复习 DAY6.洛必达求极限、不等式单调性证明、判断拐点、曲率以及曲率半径
  19. 怎么可以快速解决网络劫持
  20. win11壁纸怎么可以动 Windows11秒变动态壁纸的设置方法

热门文章

  1. Android Hessian 通信
  2. Android2.2 新特性
  3. android apk 在线分析,apkanalyzer
  4. Markdown打造高逼格博客
  5. ACL2016最佳论文:通过交互学习语言游戏
  6. 正则表达式-2-正则表达式实战1
  7. 十天学会php之第二天
  8. ZooKeeper Watcher注意事项
  9. HTML 学习笔记一
  10. Lync部署学习笔记(一)