用automake建立共享库(动态链接库)Makefile
来源:互联网 发布:淘宝跳蚤 编辑:程序博客网 时间:2024/05/17 02:23
用automake建立共享库(动态链接库)Makefile
要使用automake工具包建立一个交叉编译的共享库的Makefile
这里用的autoconf是2.67版本,在debian下实现:
如果版本低,可以用apt-getinstall 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();#endifmybdebian:/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=foreignSUBDIRS=src
rx/src目录下的Makefile.am内容如下:
AUTOMAKE_OPTIONS=foreignlib_LTLIBRARIES=librx.lalibrx_la_SOURCES=rx.cinclude_HEADERS=rx.h
其中lib_LTLIBRARIES=后面的“librx.la”为要生成的库文件名,必须写成.la,不能是.so,实际会生成librx.so文件。
下面的librx_la是librx.la把“.”换成下划线“_”后面加上“_SOURCES=”,等号以后为源文件名称,多于一个时用空格隔开。
include_HEADERS=后面的为头文件,是供其它程序包含用的,make install时会复制到安装目录的include 目录中。
回到上层目录,使用autoscan扫描源码目录:
$autoscan$lsautoscan.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_CCAC_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_AUTOMAKEAC_CONFIG_SRCDIR([src/rx.c])AC_CONFIG_HEADERS([config.h])# Checks for programs.AC_PROG_CCAC_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-missingconfigure.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了。
如我们要生成交叉编译给ARMCPU使用的共享库,这里假设我们要使用的编译器为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.alrwxrwxrwx 1 root root 11 04-19 22:48 librx.la -> ../librx.la-rw-r--r-- 1 root root 930 04-19 22:48 librx.lailrwxrwxrwx 1 root root 14 04-19 22:48 librx.so -> librx.so.0.0.0lrwxrwxrwx 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
我们再回到顶层目录,执行makeinstall可以自动安装生成的库到/usr/local/armrx2d/lib目录下。
若使用automake时出现下面错误信息
required file `./ltmain.sh' not found
是因为libtool未配置:
解决办法:
$libtoolize--automake --debug --copy –force
或:
$libtoolize--automake
- 用automake建立共享库(动态链接库)Makefile
- 用automake建立共享库(动态链接库)Makefile
- 用automake建立共享库(动态链接库)Makefile
- automake 生成动态链接库 - automake&Makefile
- automake生成动态链接库
- automake生成动态链接库
- automake生成动态链接库
- automake生成动态链接库
- automake生成makefile和mpicc链接库
- 【C/C++】automake生成动态链接库
- 动态链接共享库
- automake同时生成静态链接库和动态链接库
- automake同时生成静态链接库和动态链接库
- automake同时生成静态链接库和动态链接库
- automake 创建共享库
- automake 共享库
- 建立动态链接库DLL
- C++建立动态链接库
- 【U3D设计模式】观察者模式
- 【转载】----Maven项目错误解决小结
- kaldi003 -- log机制
- nginx负载均衡算法
- iso文件:抱歉,装载文件时出现问题
- 用automake建立共享库(动态链接库)Makefile
- java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.spri
- 设计模式-建造者模式
- Session机制详解
- rhel7.2 禁用透明的大页内存--transparent_hugepage(THP)
- eclipse中syso快捷键无法使用解决方法
- MyBatis-Configuration标签
- IOS Swift3.1 打印系统所有字体
- Appstore审核PLA1.2是什么?怎么解决?