Chinaunix首页 | 论坛 | 博客
  • 博客访问: 359946
  • 博文数量: 104
  • 博客积分: 2519
  • 博客等级: 少校
  • 技术积分: 1025
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-22 06:54
文章分类

全部博文(104)

文章存档

2009年(90)

2008年(14)

我的朋友

分类: LINUX

2009-02-16 16:48:35

用autotools制作Makefile 和configure文件。


作者:  发表于:2006-07-02 23:16:24
【】 【】 【】【】

目的 从复杂的工作中简化出来。 

网上有一些制作Makfile的文章,只停留在Makefile而已。用autotools的工具相对来说要简单的多,其它一些介绍autotools文章又有很多漏洞,而且步骤烦琐。 

制作一个最简单的helloworld程序: 

现有目录test 

mkdir src 建立src目录存放 源代码 
在src下。 
编辑hello.c文件 
[CODE] 
#include  

int main() 

        printf("hello world\n"); 
        return 0; 

[/CODE] 
在src目录下建立Makefile.am文件 (src/Makefile.am) 
[CODE] 
AUTOMAKE_OPTIONS=foreign 
bin_PROGRAMS = hello 
hello_SOURCES = hello.c 
hello_LDADD = -lpthread (只是测试,实际不需要连接该库) 
[/CODE] 
保存退出 

退到test目录  

编辑Makefile.am文件 (Makefile.am) 

SUBDIRS = src 

退出保存 

然后 
执行  
autoscan 
生成configure.scan文件 

按此编辑此文件 
[CODE] 
#                                               -*- Autoconf -*- 
# Process this file with autoconf to produce a configure script. 

AC_PREREQ(2.59) 
AC_INIT(hello,1.0, [miaoquan@nou.com.cn]) 
AM_INIT_AUTOMAKE 
AC_CONFIG_SRCDIR([src/hello.c]) 
AC_CONFIG_HEADER([config.h]) 

# Checks for programs. 
AC_PROG_CC 

# Checks for libraries. 
# FIXME: Replace `main' with a function in `-lpthread': 
AC_CHECK_LIB([pthread], [main]) 

# Checks for header files. 

# Checks for typedefs, structures, and compiler characteristics. 

# Checks for library functions. 

#AC_CONFIG_FILES([Makefile 
#                 src/Makefile]) 
AC_OUTPUT(Makefile src/Makefile) 
[/CODE] 

退出保存 
将此文件更名 mv configure.scan configure.in 
然后执行 
touch NEWS README AUTHORS ChangeLog 

然后执行 
autoreconf -fvi 

至此生成configure文件 
执行configure文件 

生成Makefile文件 

make  
make install 
make uninstall 
make dist  
试验一下吧。

[ 本帖最后由 mq110 于 2006-6-29 19:29 编辑 ]



  回复于:2006-06-29 21:15:53

多谢


  回复于:2006-06-30 00:38:24

基于文本替换的代码生成工具……


  回复于:2006-07-02 23:16:24

继续完善这个例子,论坛里有人问,如何生成静态库,并连接. 

完善hello.c这个例子 


当前目录 
     |-  src 目录 
            |-  hello.c 文件 
     |-  include 目录 
            |-  hello.h文件 
     |-  lib 目录 
            |-  test.c文件 此文件用来生成 libhello.a 

在当前目录 编写Makefile.am 
[CODE] 
SUBDIRS = lib src 
[/CODE] 

在include目录下 编写hello.h 

[CODE] 
extern void print(char *); 
[/CODE] 

在lib目录下编写test.c 

[CODE] 
#include  

void print(char *msg) 

        printf("%s\n",msg); 

[/CODE] 

在lib目录下编写Makefile.am 

[CODE] 
noinst_LIBRARIES=libhello.a 
libhello_a_SOURCES=test.c 
[/CODE] 

这里noinst_LIBRARIES 的意思是生成的静态库 ,不会被make install 安装 
然后指定libhello.a的源文件test.c 


在src目录下编写hello.c 

[CODE] 
#include "hello.h" 

int main() 

        print("haha");  //这里是静态库里的print函数 
        return 0; 


[/CODE] 

在src目录下编写Makefile.am 
[CODE] 
INCLUDES= -I../include 

bin_PROGRAMS=hello 
hello_SOURCES=hello.c 
hello_LDADD=../lib/libhello.a 
[/CODE] 

首先指定头文件的位置 ../include 
然后指定要生成执行文件 hello 
然后指定源代码文件 hello.c 
最后添加静态库的位置 ../lib/libhello.a 


按照我首篇帖子的方式. 
执行autoscan 生成configure.scan 

修改该文件 

按照首篇帖子修改. 

然后不同之处 
需要添加一行:AC_PROG_RANLIB 


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

AC_PREREQ(2.59) 
AC_INIT(hello,1.1,[miaoquan@nou.com.cn]) 
AM_INIT_AUTOMAKE 
AC_CONFIG_SRCDIR([src/hello.c]) 
AC_CONFIG_HEADER([config.h]) 

# Checks for programs. 
AC_PROG_CC 


# Checks for libraries. 
AC_PROG_RANLIB 
# Checks for header files. 

# Checks for typedefs, structures, and compiler characteristics. 

# Checks for library functions. 

#AC_CONFIG_FILES([Makefile 
 #                lib/Makefile 
  #               src/Makefile]) 
AC_OUTPUT([Makefile 
                        lib/Makefile 
                        src/Makefile]) 
[/CODE] 

mv configure.scan configure.in 


touch NEWS README AUTHORS ChangeLog 


执行autoreconf -fvi 

生成configure.执行configure生成Makefile.. 


后面同上...

[ 本帖最后由 mq110 于 2006-7-2 23:25 编辑 ]
阅读(1127) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~