📄 chinaunix_net - 求关于gnu automake autoconf 的实用例子.htm
字号:
<BR>AC_PROG_CC <BR><BR>#输出Makefile文件 <BR>AC_OUTPUT(Makefile
<BR>dir1/Makefile <BR>) <BR>[/code:1:78df12705f]
<BR>同时建立tt目录下的Makefile.am文件,这个文件很简单,就一句话: <BR>[code:1:78df12705f]
<BR>SUBDIRS=dir1 <BR>[/code:1:78df12705f]
<BR>然后建立dir1目录下的Makefile.am文件,这才是真正起作用的Makefile.am文件:
<BR>[code:1:78df12705f] <BR>bin_PROGRAMS=prog1
<BR>prog1_SOURCES=code1.c code2.c <BR>[/code:1:78df12705f]
<BR>完成之后,为了方便操作,再写一个autogen.sh文件,保存在tt目录下。 <BR>[code:1:78df12705f]
<BR>#!/bin/sh <BR>aclocal <BR>automake --add-missing
<BR>autoconf <BR>[/code:1:78df12705f]
<BR>存盘之后,用chmod +x改成可执行文件。然后执行autogen.sh。
<BR>[code:1:78df12705f] <BR>./autogen.sh <BR>[/code:1:78df12705f]
<BR>即可在tt目录下生成configure和makefile文件,同时在dir1目录下也会生成一个makefile文件。现在在tt目录下执行make,屏幕将显示如下信息:
<BR>[code:1:78df12705f] <BR>[kj501@s2023 tt]$ make
<BR>Making all in dir1
<BR>make[1]: Entering directory `/home/kj501/program/c/tt/dir1'
<BR>gcc -DPACKAGE=\"prog1\" -DVERSION=\"0.0.1\" -I. -I. -g -O2 -c code1.c
<BR>code1.c:6:2: warning: no newline at end of file
<BR>gcc -DPACKAGE=\"prog1\" -DVERSION=\"0.0.1\" -I. -I. -g -O2 -c code2.c
<BR>code2.c:13:2: warning: no newline at end of file
<BR>gcc -g -O2 -o prog1 code1.o code2.o
<BR>make[1]: Leaving directory `/home/kj501/program/c/tt/dir1'
<BR>make[1]: Entering directory `/home/kj501/program/c/tt'
<BR>make[1]: Nothing to be done for `all-am'.
<BR>make[1]: Leaving directory `/home/kj501/program/c/tt'
<BR>[/code:1:78df12705f]
<BR>进入dir1目录,就可以看到生成的prog1程序。如果再执行make install,prog1将被安装到缺省的/usr/local/bin目录下去。
<BR>这就是一个最简单的configure.in和Makefile.am的编写情况。你如果不熟悉,最好自己动手做一遍,复杂的configure.in和Makefile.am都是在这个基础上扩充的。<BR><BR></TD></TR>
<TR>
<TD>
<HR>
<SMALL> <A
href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&u=29509"
target=_blank>kj501</A> 回复于:2004-10-03 17:57:56</SMALL></TD></TR>
<TR>
<TD>在此基础上,如果要同时实现code1.c, code2.c生成 prog1, 而 code3.c生成prog2。由于code1.c,code2.c,code3.c都在同一个目录,只要改写dir1目录下的Makefile.am就可以了。
<BR>为了便于说明问题,首先要在dir1目录下增加一个code3.h 和code3.c文件。 <BR>下面是code3.h:
<BR>[code:1:4ecf204e74] <BR>#include <stdlib.h>
<BR><BR>void foo_c(); <BR>[/code:1:4ecf204e74] <BR>下面是code3.c:
<BR>[code:1:4ecf204e74] <BR>#include "code3.h"
<BR><BR>void foo_c() <BR>{
<BR>printf("This is code3.\n"); <BR>}
<BR><BR>int main() <BR>{ <BR>foo_c(); <BR>}
<BR>[/code:1:4ecf204e74] <BR>然后修改dir1目录下的Makefile.am文件:
<BR>[code:1:4ecf204e74] <BR>bin_PROGRAMS=prog1 prog2
<BR>prog1_SOURCES=code1.c code2.c <BR><BR>prog2_SOURCES=code3.c
<BR>[/code:1:4ecf204e74]
<BR>再重新执行一次autogen.sh。make之后,在dir1目录下就会同时存在prog1和prog2两个程序。
<BR>你先体会一下吧。然后自己做做用code4.c和 code5.c生成 prog3。应该很容易的。<BR><BR></TD></TR>
<TR>
<TD>
<HR>
<SMALL> <A
href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&u=182692"
target=_blank>wubulen</A> 回复于:2004-10-03 19:46:03</SMALL></TD></TR>
<TR>
<TD>十分感谢精灵王详尽的解释,现在已经清楚多了。还有三个问题需要确认。
<BR><BR>1。两个处在不同子目录下的文件共同生成一可执行文件,那需要在两个子目录下都写Makefile.am吗,还是只要在带main的那个文件的目录下写?
<BR><BR>2。在同一个目录下的文件生成几个可执行文件,configure.in写法问题。code1.c, code2.c(带main) 生成prog1,code3.c生成prog2.
<BR><BR>AC_INIT(dir1/code2.c dir1/code3.c)
<BR><BR>AM_INIT_AUTOMAKE(prog,0.0.1) #prog 这个名字可以随便取?
<BR><BR>3。关于编译器的问题,如何指定特定的编译器, AC_PROG_CC只会检查C编译器?
<BR><BR>再次感谢!<BR><BR></TD></TR>
<TR>
<TD>
<HR>
<SMALL> <A
href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&u=29509"
target=_blank>kj501</A> 回复于:2004-10-04 12:08:45</SMALL></TD></TR>
<TR>
<TD>先回答第1个问题。一般互相引用的源程序都是放在同一个目录下的,如果要放在不同的目录,可以把要引用的源文件编译成静态库文件。
<BR>为便于说明问题,准备了如下文件: <BR>在tt目录下新建dir2目录,保存code4.h和code4.c文件。
<BR>下面是code4.h: <BR>[code:1:1d78027594]
<BR>#include <stdlib.h> <BR><BR>void foo_d();
<BR>[/code:1:1d78027594] <BR>下面是code4.c: <BR>[code:1:1d78027594]
<BR>#include "code1.h" <BR>#include "code4.h"
<BR><BR>void foo_d() <BR>{
<BR>printf("This is code4.\n"); <BR>}
<BR><BR>int main() <BR>{ <BR>foo_a(); <BR>foo_d(); <BR>}
<BR>[/code:1:1d78027594] <BR>dir1目录下的code1.h和code1.c和上面的一样,我就不写了。
<BR>修改tt目录下的configure.in文件。 <BR>[code:1:1d78027594] <BR>#指定项目的一个源文件
<BR>AC_INIT(dir2/code4.c) <BR><BR>#指定项目名称和版本号
<BR>AM_INIT_AUTOMAKE(myproject, 0.0.1) <BR><BR>#检查编译器
<BR>AC_PROG_CC <BR><BR>#检查ranlib <BR>AC_PROG_RANLIB
<BR><BR>#输出Makefile文件 <BR>AC_OUTPUT(Makefile <BR>dir1/Makefile
<BR>dir2/Makefile <BR>) <BR>[/code:1:1d78027594]
<BR>同时修改tt目录下的Makefile.am文件。 <BR>[code:1:1d78027594]
<BR>SUBDIRS = dir1 dir2 <BR>[/code:1:1d78027594]
<BR>在dir1目录下修改Makefile.am文件。这时是将code1.c编译成一个不安装(noinst)的静态库文件。
<BR>[code:1:1d78027594] <BR>noinst_LIBRARIES=libcode1.a
<BR><BR>libcode1_a_SOURCES=code1.c <BR>[/code:1:1d78027594]
<BR>在dir2目录下添加一个Makefile.am文件。 <BR>[code:1:1d78027594]
<BR>INCLUDES= -I../dir1 <BR>bin_PROGRAMS=prog4
<BR><BR>prog4_SOURCES=code4.c <BR>prog4_LDADD=../dir1/libcode1.a
<BR>[/code:1:1d78027594] <BR>然后执行autogen.sh就可以了。<BR><BR></TD></TR>
<TR>
<TD>
<HR>
<SMALL> <A
href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&u=29509"
target=_blank>kj501</A> 回复于:2004-10-04 17:10:26</SMALL></TD></TR>
<TR>
<TD>关于第2个问题,我举的第2个例子正是说明这个问题,不过看来有些地方你没有理解。
<BR>AC_INIT(dir1/code2.c)写一个要检查的源文件就够了。多写是没有用的。不信你可以作一下试验。
<BR>只要把AC_INIT改为AC_INIT(dir1/code2.c,dir1/vvv.c),这个vvv.c文件是不存在的,但执行configure时,一样不会报错。但这个要检查的文件应该是程序的主文件,少了它,程序将无法运行。
<BR>AM_INIT_AUTOMAKE(package, version)是项目文件打包时的名字。比如说,AM_INIT_AUTOMAKE(mypro, 0.0.1),如果项目要发布源代码,这时打包就可以执行一个make dist,会自动生成一个mypro-0.0.1.tar.gz的文件。只要你从网上下载并编译过软件的源代码,对于这个应该不会陌生。当然从技术的角度来说,项目名称和项目版本号可以随便取,但为了管理上的方便,一般都有规范可循。<BR><BR></TD></TR>
<TR>
<TD>
<HR>
<SMALL> <A
href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&u=29509"
target=_blank>kj501</A> 回复于:2004-10-04 17:32:28</SMALL></TD></TR>
<TR>
<TD>第3个问题我也没有碰到过,我得想一下才能答复你。<BR><BR></TD></TR>
<TR>
<TD>
<HR>
<SMALL> <A
href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&u=182692"
target=_blank>wubulen</A> 回复于:2004-10-04 20:53:47</SMALL></TD></TR>
<TR>
<TD>谢谢精灵网,你的回答使我清楚多了,我会自己实践一下的。:-)<BR><BR></TD></TR>
<TR>
<TD>
<HR>
<SMALL> <A
href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&u=29509"
target=_blank>kj501</A> 回复于:2004-10-05 17:43:44</SMALL></TD></TR>
<TR>
<TD>第3个问题我看可以你可以用这个办法解决。
<BR>首先在configure.in中加上对特殊编译器的检查,如果检查不到,则configure时会停止并给出“Couldn't find mpicc.”的出错信息:
<BR>[code:1:f1442f64d8] <BR>#检查mpicc编译器
<BR>AC_CHECK_PROG(MPICC,mpicc,yes,no)
<BR><BR>if test "$MPICC" = no; then
<BR>AC_MSG_ERROR([Couldn't find mpicc.])
<BR>fi <BR>[/code:1:f1442f64d8]
<BR>然后把需要用mpicc编译的源程序放在一个目录下面。在这个目录中先用上面的方法写Makefile.am文件。然后再加上下面这部分:
<BR>[code:1:f1442f64d8] <BR>CC=mipcc <BR>CFLAGS=
<BR>[/code:1:f1442f64d8] <BR>这样用自己定义的编译器和编译标志取代系统定义的编译器和编译标志。
<BR>由于我没有mpicc编译器,没有办法亲自做试验。可能使用mpicc还有其它的要求,直接照做不一定行得通。但解决问题的思想应该就是这样了,希望你能举一反三。<BR><BR></TD></TR>
<TR>
<TD>
<HR>
<SMALL> <A
href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&u=56952"
target=_blank>win_hate</A> 回复于:2004-10-05 17:55:05</SMALL></TD></TR>
<TR>
<TD>[img:e414ca7818]http://bbs.chinaunix.net/forum/templates/subSilver/images/good_re.gif[/img:e414ca7818] [img:e414ca7818]http://bbs.chinaunix.net/forum/templates/subSilver/images/good_re.gif[/img:e414ca7818] [img:e414ca7818]http://bbs.chinaunix.net/forum/templates/subSilver/images/good_re.gif[/img:e414ca7818] [img:e414ca7818]http://bbs.chinaunix.net/forum/templates/subSilver/images/good_re.gif[/img:e414ca7818] [img:e414ca7818]http://bbs.chinaunix.net/forum/templates/subSilver/images/good_re.gif[/img:e414ca7818]<BR><BR></TD></TR>
<TR>
<TD>
<HR>
<SMALL> <A
href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&u=29509"
target=_blank>kj501</A> 回复于:2004-10-06 10:51:09</SMALL></TD></TR>
<TR>
<TD>:)<BR><BR></TD></TR>
<TR>
<TD>
<HR>
<SMALL> <A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -