我爱电脑技术论坛's Archiver

star2008 发表于 2008-5-16 08:26

Linux下automake软件编译与发布快速入门

本例假设要产生一个simserver1的软件包,源文件只有1个,simserver1.cpp。使用了pthread库。 n:`8V| X5]$r

Nqx5w;bK#p~
puV0F3P 1.运行autoscan扫描源码目录
$gr,O2@B9A^
0mUh,pk:ZHD X 7I] m-kmh
执行
tCh+~%}4z.K 1eBK5n Kgk

gW4aw-|.RH#Uc $autoscan
r'X5E[.z;E%r 7SO8^"NpH$A

+{O[W i^vD q ` 执行后生成configure.scan。 t;]1D(C y`'G
qgLB8o a'y
~SR;km4}wx
2.编辑configure.in文件 /d+T@Mq u

%sX+Ak&JE+|~
$U&_P"{4L tC 步骤1执行后生成了configure.scan,本步骤需要复制一份该文件并命名为configure.in,然后编辑该文件。 B'T.w l%GJ

:|/G `.i+k:f:b X)?
7s]q e!Nr!OD~ 命令如下: e0q7lc(a F T5i-qX

)lC5pt5W@ a2N M"xFCh.O(| E rFa
$cp configure.scan configure.in Dk;_5rr/fy(E
-Fa8V4Ed"P
[ j5F(l P@6@4V DS
$vim configure.in #\,J4\'WF,\,x@)\u]t9C

9ltt Qa}`:m1S aUAV/WaCM
用vim编辑器打开后,文件原内容如下:
f W2gmZI
'IPj\6]knI)Kv0[ D}8P3n I yCFvp
configure.scan开始 :j]:Emda
L H n7Hk+}1u9cD
"E-m4P4\lzy[^
# -*- Autoconf -*-
O9[t`'];` IS7W9QKGR;T[*]

4qt x ` bel[ # Process this file with autoconf to produce a configure script. 8V@&Qv+xe(L5Sa

o$GU MB V
{%CF_/zp AC_PREREQ(2.61)
(U zQQj c E
6M0BFJ+Hs JhWU
#L&J5y?;I$b _%g AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
wWxr!X"? A$P ~ E-G4JPCcY?
af%v)Z/s A
AC_CONFIG_SRCDIR([simserver1.cpp]) ~1cd\0a!O

)uD9uj$W&z0A
_`e\Z AC_CONFIG_HEADER([config.h])
/L2Y[n{
O8ov5[;b(s!v`DU BL }ks
# Checks for programs. /_.}*HN,PwG

b h8L2N;c!x p)L1K &V O]Wzoi*~
AC_PROG_CXX 5inc8iw H0d

0b$]"t2`:},Y`~&N
%g"Y"N4v&gr}g0d # Checks for libraries. 7G E^bbH ta
1C6uEW9alU

K\Y!_1eFRN0q6R # FIXME: Replace `main' with a function in `-lpthread':
'P.t{!ZA%B?^+p
Kr(Zs#T\6mQ 4]O ?6N#y!g#C!XS
AC_CHECK_LIB([pthread], [main])
;q*Z*\/D+V@XUz O4K(O -n2V6i MW ?p

!PNs-n4Dv L5G M b # Checks for header files. k,d2K4q*T:_bJ h2y G
O&H;~(V%M4z'U

{AJ;RmO{3m0O AC_CHECK_HEADERS([arpa/inet.h netinet/in.h sys/socket.h]) *d6@i+y8o.Y
:@'mK.YRD8W8h"z'y
R+NH9e0c(cL
# Checks for typedefs, structures, and compiler characteristics.
hXMP A
r m@,ZYs0J V Y
;|)kGQ;Ea)`3_ # Checks for library functions.
b!GMi X'h5| ?} y1E*^5N*@(D

4qE,@G1@1M AC_HEADER_STDC 3Y m7v'{F.Z

]i:?,\7FcU1@[
,Q-bBs d-z+\!Y^0k AC_CHECK_FUNCS([bzero inet_ntoa socket]) m0V;o0THqJo y

)h(U$B'_`g /k+J9mP)toj)x4G
AC_CONFIG_FILES([Makefile]) _$s s i*t[&aQM
8p3s+q&gm)qm
*p*\ u'YDD
AC_OUTPUT
5H!w J:Jo IGS*](][ f

2M+Yz j*F configure.scan结束
rJ;JgI6nU R
7O'S{O\ tGU -YVn m Oi HGe @k
编辑修改成如下内容:
H;aSPw7j.kR,|{P -LJRMq'M
T+v9T~~
configure.in开始 m.Y]`h"K

&R9H&o!i*Y5uJ
"T8Ux1wfoS # -*- Autoconf -*- BKU4[-z+S_:Q
NWp!nUrfS'Z*`

1L J'|(f s # Process this file with autoconf to produce a configure script. 8Bz;GG-~:YORR
#z4DOW+]C,z8D6x^v

W:Y.|#UQ8PN AC_INIT(simserver1.cpp) #这个宏用来检查源代码所在的路径,放在文件开头 o BI,] C

nN^^;Dmz
-z,G2d$dsan5^g&g AM_INIT_AUTOMAKE(simserver1,1.0)   #描述软件包名称及版本号 Fx-LjM/Ls

R\}Nl:^
}^:HdUo7]K7D # Checks for programs. \}*yO&JH A'Ay

OOM;}c2U%Y 6{e)sv$y{
AC_PROG_CXX #使用C++
g2NU@8K+Xx~t%k7M
A l E$p/`on~ *d4eb'Pe
# Checks for libraries. {Mt;m3z;w)t
t8Y,c cFPe I)q
.jkGT0kdB2x
# Checks for header files. _6R;n.j ?&d
4@ Yi4Ma8F7r3{
+xD s I"d Np_
AC_CHECK_HEADERS([arpa/inet.h netinet/in.h sys/socket.h]) .O*E&aQ![M(S.C!A|C
.k\,s-H Vs

+p*x0x zF.qw.}r J # Checks for typedefs, structures, and compiler characteristics. s/vsk.~7}9F

QX vd)h2N $rf S![^&Md
# Checks for library functions. 'NY8w[(l5U

w9] W#H*B)e%a8V7n2Y
F.aA y#^},y AC_HEADER_STDC -um(bys w:g vKF(v Y

.|s6o#P3v K a c.@u0a Fp2v
AC_CHECK_FUNCS([bzero inet_ntoa socket]) ;Ce%f%GS:sX*d*N
oD*YE2lm h

F%K!mvOoZ f AC_OUTPUT(Makefile) #这个宏是我们要输出的Makefile的名字 \5V3|(as FUb

F+{'F?N/` w GmUDG w9Y u
configure.in结束

star2008 发表于 2008-5-16 08:26

3.运行aclocal生成aclocal.m4文件
7@"c]n|^Qp
D"Y3{.n?euS-Nb r'USjA B,e
configure.in文件编辑保存完后,用aclocal命令生成aclocal.m4文件。
g4N g%@$r)L@ Ixw
,@*\oH2^J |0O-`W
S.R8U:k_Il,]~ 执行以下命令:
mo d8K1Y"p%Na:B !OCRL:Q2Cjm
+x$~|.\p
$aclocal
/cK[ Yo @ [
4a1K~ A-}w+c!l A
2I q]dK 然后用ls列出生成的文件。如果没有找到aclocal.m4文件,那一般是configure.in文件不对,修改后再重试。 9r? t|DK
,j.{3{%r;` xR(|

e Y1j]E#]jU _ 4.运行autoconf生成configure文件
H;X2~ Yo5^ h[H"ZUD1{n,B+e
y3w0Q`9y'X'N LEb
用autoconf命令来生成configure可执行文件。 5HT"R nx"X~,X2mX

w6t`O V x y | XN5}O 3wN.Ue'xB_
执行以下命令: G~"oc5ZyO r],^3n

Fz\7Nf
3[/g#F)M _@P#v4j $autoconf
\p:g:Me R_p
/P7u;KS/B,hMf !pc*f|U;V[
然后用ls检查configure是否已经成功生成。
'\(K)F k@2ls Q(q J
m0E a ?A Yof8V i
5.建立Makefile.am文件 jNb!Z6]'y#p8Y7~ L4p
Mv B*uT7EA
q _`i TO
Makefile.am是用来生成Makefile.in的,需要你手工书写。Makefile.am中定义了一些内容: :\n~ |xk}

/N ^W gA-Y9\.n6C
&J` o8A0]&F[ pZ} Q AUTOMAKE_OPTIONS :F{c/x N.?0K0`

g u%t+I%?.^ l.p~j!`!x
这个是automake的选项。在执行automake时,它会检查目录下是否存在标准GNU软件包中应具备的各种文件,例如AUTHORS、ChangeLog、NEWS等文件。我们将其设置成foreign时,automake会改用一般软件包的标准来检查。
f8X(P"f)J[F f6K(u%l )a7V.UT0B1^L
Q3v P/G"Tk
bin_PROGRAMS
L)u*h;a6N9hY`E
+t.D"[/p&]ib
5J@Tn:bG0i 这个是指定我们所要产生的可执行文件的文件名。如果你要产生多个可执行文件,那么在各个名字间用空格隔开。 ?/`,Qo ~`

+]9@3k4Uk/uD] DW 9X YI.qIlRI
helloworld_SOURCES
b5V9DT-t a1f6S
@'u2S)t!t0A t1J K[8Q7\+hk
这个是指定产生“helloworld”时所需要的源代码。如果它用到了多个源文件,那么请使用空格符号将它们隔开。比如需要 helloworld.h,helloworld.c那么请写成helloworld_SOURCES= helloworld.h helloworld.c。
,X1?!{)eUR'X
ro6[+|P^:Y5O)L4g8{ Kzu#q6n
如果你在bin_PROGRAMS定义了多个可执行文件,则对应每个可执行文件都要定义相对的filename_SOURCES。
3k&~XD,Rg~
6x B7b/MzHZ*Et@ 6o3x+{'l0b-TY _'s(S
LIBS "pq~,H;L(g

-O-R6U1n1p`8] _ p z/a)zs6f,z
这个用来指定链接的程序库。如LIBS += -lpthread,指定链接pthread库。
Ro|-q x
F K-Mb@H3H&]ox#iW~
(\jb[J7A9~&Y%b3\-h 执行命令:
(H0jn%_#a2Ou r(}DJ-XT Vk'w
SUV,b nc
$vim Makefilemam
V5^TLL(E ^ Bu{%C-SE
,~/GrU-chdi(pdsV
进入编辑界面,输入内容如下:
5N Cp%g g@ /Y5irl"~MQ

bX8h+iLj AUTOMAKE_OPTIONS=foreign 0_v1B'G6x?/J |
B~ D#R2d*b,N(uU
%\5fWQhX-zR7\
bin_PROGRAMS=simserver1 #软件包名称
,F2s$ah C+bX \'_o v+L,X"Kr
(l!_'].A"[7KTUg:HC] _
simserver1_SOURCES=simserver1.cpp  #源文件列表,如果有多个则用空格分开 /\1P#t\6k8OP
o i V:B;o~(ko
#}@i0|+o#a Ad` Y'a2a
LIBS += -lpthread #链接pthread库 -h"l%~k*Lp/@K
9av?*Im2qUe

(z2@V+I$AS 6.运行automake
O0F { l8s)c
L@P9h8aQp.{U'F J4K Oe V}vR8{
执行automake --add-missing来产生Makefile.in。
f+Lzxyl#iS^H 0kKOX-B^ S0A

*B8x3l j\!C+w"}j $automake --add-missing l%s*eU"Og(~

]!w!cd0v y1C "\:[Dh AW P
执行后应该生成Makefile.in文件. v6Tz%MgW Y6h)uD
`%n G-Hv
T#X+PY?e/F)v9Ia
7.运行configure生成Makefile n9h,mUxmM Y}

ag1Q9tD
S(`'P;j'ti3Wa 执行:
"D7S7}(fH~ F RKe5F(k
^Uy3IP
$./configure C!Y~)t OCXkW

*N Bi|Q+@hn &~gy+r^4bkZ
8.执行make生成可执行文件
/U l%M:LNg*f\#Y '?L'c;P7aH/~'}e
bI)G7i%Hj$K+H
$make
~E-@1{&h4E.e2u,L/U ak _.bsv@*|?

&\k{ft+k 执行后应该编译输出simserver1可执行文件. q i2x w8}.k f9ew n#V

_2w:[,B j 'vv|-J1E&cwN4YG^
make还有以下几个命令:
6qH5Q/NWu9nuI@F Q[/}y Y K
5b:B Q9a-fgFQ%BW
make install可以将simserver1安装到/usr/local/bin目录下;
'G&[9I lo,t
@*y.}/O1RQ q] Y"Gz;k1i:` |f/I
make clean可清除上次编译结果
2P`(B9Y(o{/?/d8s.`B
_h(\z+}V?w"U I ~rG}N
make dist可将代码打包成packagename-ver.tar.gz文件 y9{/cT r7i

5KHy.opP@/A3fN o LHVNm3W!h$_
make distcheck用来检查打包的软件包是否正常。

页: [1]

Powered by 我爱电脑技术论坛 Archiver 6.1.0  © 2001-2007 本SEO插件由网络人站长论坛出品