Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42846
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 330
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-28 17:39
文章分类
文章存档

2015年(31)

我的朋友

分类: 嵌入式

2015-10-28 00:23:35

一.简单的一个工程
1目录结构:testmake/src/main.c,即就只有一个源程序文件,testmake工程目录。
1.1 automake模板:
testmake/下建立文件Makefile.am,内容为SUBDIRS=src

testmake/src下建立文件Makefile.am,内容为
bin_PROGRAMS=testmake 
testmake _sources=main.c

1.2 autoconf模板
切换到testmake目录,执行命令
autoscan
产生configure.scan

重命名:
mv configure.scan configure.in

修改
vi configure.in

修改初始化autoconf的AC_INIT项为:
AC_INIT(testmake , 0.1, 11111)

添加初始化automake的AM_INIT_AUTOMAKE项为:
AM_INIT_AUTOMAKE(testmake, 0.1);

1.3
执行aclocal
拷贝用到的宏定义

1.6
执行
autoheader
产生配置头文件的模板

1.7
touch README NEWS AUTHORS ChangLog

1.8
执行
autoconf 
automake -a
产生要执行的configure文件和Makefile.in

1.9
执行./configure
参数 -prefix和 -host用于指定目录和要用的编译器

这样就自动产生了Makefile文件。

二. linux 自动项目管理automake:
2.1.必须软件:
autoconf/automake/m4/perl/libtool
autoconf:自动配置软件源码包,适应多种shell脚本工具,要用到m4
automake:Makefile.am--->Makefile.in的工具,要用到perl,由于其完全遵循GNU,故创建中不用perl

automake支持三种目录:
一是源文件,头文件,其他库文件都在当前目录中,没有子目录。
二是主要源文件在当前目录,部分功能的源文件在各自目录。
三是所有的源代码都在子目录中,顶层没有任何源文件。

2.2
configure.scan:
结构:
AC_INIT开头,
测试程序
测试函数库
测试头文件
测试类型定义
测试结构
测试编译器特性
测试库函数
测试系统调用

以AC_OUTPUT结尾,

2.3configure.in修改部分:
修改AC_INIT(**, **, **)

添加
AM_INIT_AUTOMAKE(binprigram, version)

多线程中需修改:
#FIXME:replace 'main' with a function in '-lpthread'
AC_CHECK_LIB([pthread], [main])---->AC_CHECK_LIB([pthread], [pthread_rwlock_init])

使用库时添加:AC_PROG_RANLIB
使用c++时用:AC_PROC_CXX
使用c时用:AC_PROC_CC

2.4.Makefile.am

2.4.1需要生成的文件
可执行文件:
bin_PROGRAMS=foo
foo_SOURCES=***.c
foo_LDADD=
foo_LDFLAGS=
foo_DEPENDENCIES=
静态库:
lib_LIBARIES=libfoo.a
foo_a_SOURCES=***.c
foo_a_LIBADD=
foo_a_LDFLAGS=
头文件:
include_HEADERS=foo.h
数据文件:
data_DATA=data1 data2

如果只想编译,可以用noinst_PROGRAMS和noinst_LIBARIES代替,表示不用安装到系统。

2.4.2
Makefile.am中的一些全局变量:
INCLUDES:连接是所需要的头文件
LDADD: 可执行程序连接时所需要的库文件
LDFLAGS:链接时所需要的库文件选项标志(如gcc中的:-L -I -fpic -shared)
EXTRA_DIST:源程序和默认的文件自动打入.tar.gz包
SUBDIRS:需要递归处理的子目录

LIBADD:库连接时所需要的其他库文件

LIBTOOLFFLAGS:libtool编译选项
CFLAGS/CXXFFLAGS:对应gcc中 的-o2 -g
可用的路径变量:
$(top_srcdir): 工程最顶层目录,用于引用源程序
$(top_builddir): 目标文件的最上层,用于引用.o等编译出来的目标文件

2.5编译可执行文件
bin_PROGRAM=xxx
xxx_SOURCES=***.c 
xxx_LDADD = 
xxx_LDFLAGS = 
xxx_CFLAGS = 

将除main外的函数文件编译为静态库,这样实现就简单多了

2.6库
xxx_LIBRARIES = lib***.a
lib***_a_SOURCES = ***.c 
lib***_a_LIBADD = 

2.7动态库
mylibdir = $libdir
mylib_PROGRAMS = libutils.so
libutils_so_SOURCES = utils.c utils.h
libutils_so_LDFFLAGS = -shared -fpic

编译为动态库,这需要将编译类型修改为LTLIBRARES,注意,automake中的LIBRARIES生成的是静态库。
同时configure.in中需要添加LT_INIT,同时去掉AC_PROG_RANLIB
注:automake内置libtool支持

2.8补充:
目录
prefix /usr/local
exec_prefix $(prefix)
bindir $(exec_prefix/bin)
libdir $(exec_prefix/lib)
includedir $(prefix)/include
noinstdir

2.8打包:
将data_DATA 打包:
dist_data_DATA = distribute_this

将foo_SOURCES不打包:
nodist_data_DATA =do-not-distribute

2.9其他一些宏:
AC_ARG_WITH

AM_CONDITIONAL
AC_ARG_ENABLE

AC_CHECK_HEADER
AC_CHECK_HEADERS


AC_CHECK_LIB


阅读(502) | 评论(0) | 转发(0) |
0

上一篇:中断返回地址计算

下一篇:struct

给主人留下些什么吧!~~