用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 编辑 ]
|
|
阅读(1183) | 评论(0) | 转发(0) |