目的从复杂的工作中简化出来。 <br />网上有一些制作Makfile的**,只停留在Makefile而已。用autotools的工具相对来说要简单的多,其它一些介绍autotools**又有很多漏洞,而且步骤烦琐。<br /><br />制作一个最简单的helloworld程序: <br />现有目录test <br />mkdir src 建立src目录存放 源代码 <br />在src下。 <br />编辑hello.c文件 <br /><br /><br />代码:<br /> #include <stdio.h> int main() { printf('hello world'); return 0; } <br /><br />在src目录下建立Makefile.am文件 (src/Makefile.am) <br /><br /><br />代码:<br /> AUTOMAKE_OPTIONS=foreign bin_PROGRAMS = hello hello_SOURCES = hello.c hello_LDADD = -lpthread (只是测试,实际不需要连接该库) <br /><br />保存退出 <br />退到test目录 <br />编辑Makefile.am文件 (Makefile.am) <br />SUBDIRS = src <br />退出保存 <br />然后 <br />执行 <br />autoscan <br />生成configure.scan文件 <br />按此编辑此文件 <br /><br /><br />代码:<br /> # -*- 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) <br /><br />退出保存 <br />将此文件更名 mv configure.scan configure.in <br />然后执行 <br />touch NEWS README AUTHORS ChangeLog <br />然后执行 <br />autoreconf -fvi <br />至此生成configure文件 <br />执行configure文件 <br />生成Makefile文件 <br />make <br />make install <br />make uninstall <br />make dist <br />试验一下吧。<br />继续完善这个例子,论坛里有人问,如何生成静态库,并连接. <br />完善hello.c这个例子 <br /><br />当前目录 <br /> |- src 目录 <br /> |- hello.c 文件 <br /> |- include 目录 <br /> |- hello.h文件 <br /> |- lib 目录 <br /> |- test.c文件 此文件用来生成 libhello.a <br />在当前目录 编写Makefile.am <br /><br /><br />代码:<br /> SUBDIRS = lib src <br /><br />在include目录下 编写hello.h <br /><br /><br />代码:<br /> extern void print(char *); <br /><br />在lib目录下编写test.c <br /><br /><br />代码:<br /> #include <stdio.h> void print(char *msg) { printf('%s',msg); } <br /><br />在lib目录下编写Makefile.am <br /><br /><br />代码:<br /> noinst_LIBRARIES=libhello.a libhello_a_SOURCES=test.c <br /><br />这里noinst_LIBRARIES 的意思是生成的静态库 ,不会被make install 安装 <br />然后指定libhello.a的源文件test.c <br /><br />在src目录下编写hello.c <br /><br /><br />代码:<br /> #include 'hello.h' int main() { print('haha'); //这里是静态库里的print函数 return 0; } <br /><br />在src目录下编写Makefile.am <br /><br /><br />代码:<br /> INCLUDES= -I../include bin_PROGRAMS=hello hello_SOURCES=hello.c hello_LDADD=../lib/libhello.a <br /><br />首先指定头文件的位置 ../include <br />然后指定要生成执行文件 hello <br />然后指定源代码文件 hello.c <br />最后添加静态库的位置 ../lib/libhello.a <br /><br />按照我首篇帖子的方式. <br />执行autoscan 生成configure.scan <br />修改该文件 <br />按照首篇帖子修改. <br />然后不同之处 <br />需要添加一行:AC_PROG_RANLIB <br /><br /><br /><br />代码:<br /> # -*- 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]) <br /><br />mv configure.scan configure.in <br /><br />touch NEWS README AUTHORS ChangeLog <br /><br />执行autoreconf -fvi <br />生成configure.执行configure生成Makefile<br />后面同上...<br /> |
|