<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Dark Angle-随笔分类-Linux</title><link>http://www.cppblog.com/niewenlong/category/4232.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 24 Aug 2008 10:37:13 GMT</lastBuildDate><pubDate>Sun, 24 Aug 2008 10:37:13 GMT</pubDate><ttl>60</ttl><item><title>[Linux]使linux默认从文本界面启动 </title><link>http://www.cppblog.com/niewenlong/archive/2008/08/24/59752.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Sat, 23 Aug 2008 22:58:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/08/24/59752.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/59752.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/08/24/59752.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/59752.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/59752.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.shell下键入vi /etc/inittab<br>2.将 id:5:initdefault 中的5改为3，那么默认的启动方式会改为文本模式。<br>注：<br>0 关机<br>1 单用户模式<br>2 多用户模式，但是不支持网络访问<br>3 多用户模式，文本模式启动<br>4 无定义的<br>5 图形化界面<br>6 重启&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2008/08/24/59752.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/59752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-08-24 06:58 <a href="http://www.cppblog.com/niewenlong/archive/2008/08/24/59752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql日期和时间函数不求人</title><link>http://www.cppblog.com/niewenlong/archive/2008/08/15/58900.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Thu, 14 Aug 2008 16:28:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/08/15/58900.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/58900.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/08/15/58900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/58900.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/58900.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型。&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">这里是一个使用日期函数的例子。下面的查询选择了所有记录，其date_col的值是在最后30天以内：&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">mysql&gt; SELECT something FROM table&nbsp; <br>WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) &lt;= 30;&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">DAYOFWEEK(date)&nbsp; <br>返回日期date的星期索引(1=星期天，2=星期一, &#8230;&#8230;7=星期六)。这些索引值对应于ODBC标准。&nbsp; <br>mysql&gt; select DAYOFWEEK('1998-02-03');&nbsp; <br>-&gt; 3&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">WEEKDAY(date)&nbsp; <br>返回date的星期索引(0=星期一，1=星期二, &#8230;&#8230;6= 星期天)。&nbsp; <br>mysql&gt; select WEEKDAY('1997-10-04 22:23:00');&nbsp; <br>-&gt; 5&nbsp; <br>mysql&gt; select WEEKDAY('1997-11-05');&nbsp; <br>-&gt; 2&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">DAYOFMONTH(date)&nbsp; <br>返回date的月份中日期，在1到31范围内。&nbsp; <br>mysql&gt; select DAYOFMONTH('1998-02-03');&nbsp; <br>-&gt; 3&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">DAYOFYEAR(date)&nbsp; <br>返回date在一年中的日数, 在1到366范围内。&nbsp; <br>mysql&gt; select DAYOFYEAR('1998-02-03');&nbsp; <br>-&gt; 34&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">MONTH(date)&nbsp; <br>返回date的月份，范围1到12。&nbsp; <br>mysql&gt; select MONTH('1998-02-03');&nbsp; <br>-&gt; 2&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">DAYNAME(date)&nbsp; <br>返回date的星期名字。&nbsp; <br>mysql&gt; select DAYNAME("1998-02-05");&nbsp; <br>-&gt; 'Thursday'&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">MONTHNAME(date)&nbsp; <br>返回date的月份名字。&nbsp; <br>mysql&gt; select MONTHNAME("1998-02-05");&nbsp; <br>-&gt; 'February'&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">QUARTER(date)&nbsp; <br>返回date一年中的季度，范围1到4。&nbsp; <br>mysql&gt; select QUARTER('98-04-01');&nbsp; <br>-&gt; 2&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">WEEK(date)&nbsp; <br>　&nbsp; <br>WEEK(date,first)&nbsp; <br>对于星期天是一周的第一天的地方，有一个单个参数，返回date的周数，范围在0到52。2个参数形式WEEK()允许 <br>你指定星期是否开始于星期天或星期一。如果第二个参数是0，星期从星期天开始，如果第二个参数是1， <br>从星期一开始。&nbsp; <br>mysql&gt; select WEEK('1998-02-20');&nbsp; <br>-&gt; 7&nbsp; <br>mysql&gt; select WEEK('1998-02-20',0);&nbsp; <br>-&gt; 7&nbsp; <br>mysql&gt; select WEEK('1998-02-20',1);&nbsp; <br>-&gt; 8&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">YEAR(date)&nbsp; <br>返回date的年份，范围在1000到9999。&nbsp; <br>mysql&gt; select YEAR('98-02-03');&nbsp; <br>-&gt; 1998&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">HOUR(time)&nbsp; <br>返回time的小时，范围是0到23。&nbsp; <br>mysql&gt; select HOUR('10:05:03');&nbsp; <br>-&gt; 10&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">MINUTE(time)&nbsp; <br>返回time的分钟，范围是0到59。&nbsp; <br>mysql&gt; select MINUTE('98-02-03 10:05:03');&nbsp; <br>-&gt; 5&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">SECOND(time)&nbsp; <br>回来time的秒数，范围是0到59。&nbsp; <br>mysql&gt; select SECOND('10:05:03');&nbsp; <br>-&gt; 3&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">PERIOD_ADD(P,N)&nbsp; <br>增加N个月到阶段P（以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。&nbsp; <br>mysql&gt; select PERIOD_ADD(9801,2);&nbsp; <br>-&gt; 199803&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">PERIOD_DIFF(P1,P2)&nbsp; <br>返回在时期P1和P2之间月数，P1和P2应该以格式YYMM或YYYYMM。注意，时期参数P1和P2不是日期值。&nbsp; <br>mysql&gt; select PERIOD_DIFF(9802,199703);&nbsp; <br>-&gt; 11&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">DATE_ADD(date,INTERVAL expr type)&nbsp; <br>　&nbsp; <br>DATE_SUB(date,INTERVAL expr type)&nbsp; <br>　&nbsp; <br>ADDDATE(date,INTERVAL expr type)&nbsp; <br>　&nbsp; <br>SUBDATE(date,INTERVAL expr type)&nbsp; <br>这些功能执行日期运算。对于MySQL 3.22，他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。 <br>在MySQL 3.23中，你可以使用+和-而不是DATE_ADD()和DATE_SUB()。（见例子）date是一个指定开始日期的 <br>DATETIME或DATE值，expr是指定加到开始日期或从开始日期减去的间隔值一个表达式，expr是一个字符串；它可以以 <br>一个&#8220;-&#8221;开始表示负间隔。type是一个关键词，指明表达式应该如何被解释。EXTRACT(type FROM date)函数从日期 <br>中返回&#8220;type&#8221;间隔。下表显示了type和expr参数怎样被关联： type值 含义 期望的expr格式&nbsp; <br>SECOND 秒 SECONDS&nbsp; <br>MINUTE 分钟 MINUTES&nbsp; <br>HOUR 时间 HOURS&nbsp; <br>DAY 天 DAYS&nbsp; <br>MONTH 月 MONTHS&nbsp; <br>YEAR 年 YEARS&nbsp; <br>MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS"&nbsp; <br>HOUR_MINUTE 小时和分钟 "HOURS:MINUTES"&nbsp; <br>DAY_HOUR 天和小时 "DAYS HOURS"&nbsp; <br>YEAR_MONTH 年和月 "YEARS-MONTHS"&nbsp; <br>HOUR_SECOND 小时, 分钟， "HOURS:MINUTES:SECONDS"&nbsp; <br>DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES"&nbsp; <br>DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS"&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">MySQL在expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果date参数是一个DATE值并且你的计算仅仅 <br>包含YEAR、MONTH和DAY部分(即，没有时间部分)，结果是一个DATE值。否则结果是一个DATETIME值。&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">mysql&gt; SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;&nbsp; <br>-&gt; 1998-01-01 00:00:00&nbsp; <br>mysql&gt; SELECT INTERVAL 1 DAY + "1997-12-31";&nbsp; <br>-&gt; 1998-01-01&nbsp; <br>mysql&gt; SELECT "1998-01-01" - INTERVAL 1 SECOND;&nbsp; <br>-&gt; 1997-12-31 23:59:59&nbsp; <br>mysql&gt; SELECT DATE_ADD("1997-12-31 23:59:59",&nbsp; <br>INTERVAL 1 SECOND);&nbsp; <br>-&gt; 1998-01-01 00:00:00&nbsp; <br>mysql&gt; SELECT DATE_ADD("1997-12-31 23:59:59",&nbsp; <br>INTERVAL 1 DAY);&nbsp; <br>-&gt; 1998-01-01 23:59:59&nbsp; <br>mysql&gt; SELECT DATE_ADD("1997-12-31 23:59:59",&nbsp; <br>INTERVAL "1:1" MINUTE_SECOND);&nbsp; <br>-&gt; 1998-01-01 00:01:00&nbsp; <br>mysql&gt; SELECT DATE_SUB("1998-01-01 00:00:00",&nbsp; <br>INTERVAL "1 1:1:1" DAY_SECOND);&nbsp; <br>-&gt; 1997-12-30 22:58:59&nbsp; <br>mysql&gt; SELECT DATE_ADD("1998-01-01 00:00:00",&nbsp; <br>INTERVAL "-1 10" DAY_HOUR);&nbsp; <br>-&gt; 1997-12-30 14:00:00&nbsp; <br>mysql&gt; SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);&nbsp; <br>-&gt; 1997-12-02&nbsp; <br>mysql&gt; SELECT EXTRACT(YEAR FROM "1999-07-02");&nbsp; <br>-&gt; 1999&nbsp; <br>mysql&gt; SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");&nbsp; <br>-&gt; 199907&nbsp; <br>mysql&gt; SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");&nbsp; <br>-&gt; 20102&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">如果你指定太短的间隔值(不包括type关键词期望的间隔部分)，MySQL假设你省掉了间隔值的最左面部分。例如， <br>如果你指定一个type是DAY_SECOND，值expr被希望有天、小时、分钟和秒部分。如果你象"1:10"这样指定值， <br>MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说，"1:10" DAY_SECOND以它等价于"1:10" MINUTE_SECOND <br>的方式解释，这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期， <br>结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数，日子在新月用最大的天调整。&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">mysql&gt; select DATE_ADD('1998-01-30', Interval 1 month);&nbsp; <br>-&gt; 1998-02-28&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">注意，从前面的例子中词INTERVAL和type关键词不是区分大小写的。&nbsp; <br>TO_DAYS(date)&nbsp; <br>给出一个日期date，返回一个天数(从0年的天数)。&nbsp; <br>mysql&gt; select TO_DAYS(950501);&nbsp; <br>-&gt; 728779&nbsp; <br>mysql&gt; select TO_DAYS('1997-10-07');&nbsp; <br>-&gt; 729669&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">FROM_DAYS(N)&nbsp; <br>给出一个天数N，返回一个DATE值。&nbsp; <br>mysql&gt; select FROM_DAYS(729669);&nbsp; <br>-&gt; '1997-10-07'&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">DATE_FORMAT(date,format)&nbsp; <br>根据format字符串格式化date值。下列修饰符可以被用在format字符串中： %M 月名字(January&#8230;&#8230;December)&nbsp; <br>%W 星期名字(Sunday&#8230;&#8230;Saturday)&nbsp; <br>%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。）&nbsp; <br>%Y 年, 数字, 4 位&nbsp; <br>%y 年, 数字, 2 位&nbsp; <br>%a 缩写的星期名字(Sun&#8230;&#8230;Sat)&nbsp; <br>%d 月份中的天数, 数字(00&#8230;&#8230;31)&nbsp; <br>%e 月份中的天数, 数字(0&#8230;&#8230;31)&nbsp; <br>%m 月, 数字(01&#8230;&#8230;12)&nbsp; <br>%c 月, 数字(1&#8230;&#8230;12)&nbsp; <br>%b 缩写的月份名字(Jan&#8230;&#8230;Dec)&nbsp; <br>%j 一年中的天数(001&#8230;&#8230;366)&nbsp; <br>%H 小时(00&#8230;&#8230;23)&nbsp; <br>%k 小时(0&#8230;&#8230;23)&nbsp; <br>%h 小时(01&#8230;&#8230;12)&nbsp; <br>%I 小时(01&#8230;&#8230;12)&nbsp; <br>%l 小时(1&#8230;&#8230;12)&nbsp; <br>%i 分钟, 数字(00&#8230;&#8230;59)&nbsp; <br>%r 时间,12 小时(hh:mm:ss [AP]M)&nbsp; <br>%T 时间,24 小时(hh:mm:ss)&nbsp; <br>%S 秒(00&#8230;&#8230;59)&nbsp; <br>%s 秒(00&#8230;&#8230;59)&nbsp; <br>%p AM或PM&nbsp; <br>%w 一个星期中的天数(0=Sunday &#8230;&#8230;6=Saturday ）&nbsp; <br>%U 星期(0&#8230;&#8230;52), 这里星期天是星期的第一天&nbsp; <br>%u 星期(0&#8230;&#8230;52), 这里星期一是星期的第一天&nbsp; <br>%% 一个文字&#8220;%&#8221;。&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">所有的其他字符不做解释被复制到结果中。&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');&nbsp; <br>-&gt; 'Saturday October 1997'&nbsp; <br>mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');&nbsp; <br>-&gt; '22:23:00'&nbsp; <br>mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00',&nbsp; <br>'%D %y %a %d %m %b %j');&nbsp; <br>-&gt; '4th 97 Sat 04 10 Oct 277'&nbsp; <br>mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00',&nbsp; <br>'%H %k %I %r %T %S %w');&nbsp; <br>-&gt; '22 22 10 10:23:00 PM 22:23:00 00 6'&nbsp; <br>MySQL3.23中，在格式修饰符字符前需要%。在MySQL更早的版本中，%是可选的。&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">TIME_FORMAT(time,format)&nbsp; <br>这象上面的DATE_FORMAT()函数一样使用，但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。 <br>其他修饰符产生一个NULL值或0。&nbsp; <br>CURDATE()&nbsp; <br>　&nbsp; <br>CURRENT_DATE&nbsp; <br>以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值，取决于函数是在一个字符串还是数字上下文被使用。&nbsp; <br>mysql&gt; select CURDATE();&nbsp; <br>-&gt; '1997-12-15'&nbsp; <br>mysql&gt; select CURDATE() + 0;&nbsp; <br>-&gt; 19971215&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">CURTIME()&nbsp; <br>　&nbsp; <br>CURRENT_TIME&nbsp; <br>以'HH:MM:SS'或HHMMSS格式返回当前时间值，取决于函数是在一个字符串还是在数字的上下文被使用。&nbsp; <br>mysql&gt; select CURTIME();&nbsp; <br>-&gt; '23:50:26'&nbsp; <br>mysql&gt; select CURTIME() + 0;&nbsp; <br>-&gt; 235026&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">NOW()&nbsp; <br>　&nbsp; <br>SYSDATE()&nbsp; <br>　&nbsp; <br>CURRENT_TIMESTAMP&nbsp; <br>以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间，取决于函数是在一个字符串还是在数字的 <br>上下文被使用。&nbsp; <br>mysql&gt; select NOW();&nbsp; <br>-&gt; '1997-12-15 23:50:26'&nbsp; <br>mysql&gt; select NOW() + 0;&nbsp; <br>-&gt; 19971215235026&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">UNIX_TIMESTAMP()&nbsp; <br>　&nbsp; <br>UNIX_TIMESTAMP(date)&nbsp; <br>如果没有参数调用，返回一个Unix时间戳记(从'1970-01-01 00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一 <br>个date参数被调用，它返回从'1970-01-01 00:00:00' GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME <br>字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。&nbsp; <br>mysql&gt; select UNIX_TIMESTAMP();&nbsp; <br>-&gt; 882226357&nbsp; <br>mysql&gt; select UNIX_TIMESTAMP('1997-10-04 22:23:00');&nbsp; <br>-&gt; 875996580&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">当UNIX_TIMESTAMP被用于一个TIMESTAMP列，函数将直接接受值，没有隐含的&#8220;string-to-unix-timestamp&#8221;变换。&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">FROM_UNIXTIME(unix_timestamp)&nbsp; <br>以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值，取决于函数是在一个字符串 <br>还是或数字上下文中被使用。&nbsp; <br>mysql&gt; select FROM_UNIXTIME(875996580);&nbsp; <br>-&gt; '1997-10-04 22:23:00'&nbsp; <br>mysql&gt; select FROM_UNIXTIME(875996580) + 0;&nbsp; <br>-&gt; 19971004222300&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">FROM_UNIXTIME(unix_timestamp,format)&nbsp; <br>返回表示 Unix 时间标记的一个字符串，根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条 <br>目同样的修饰符。&nbsp; <br>mysql&gt; select FROM_UNIXTIME(UNIX_TIMESTAMP(),&nbsp; <br>'%Y %D %M %h:%i:%s %x');&nbsp; <br>-&gt; '1997 23rd December 03:43:30 x'&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">SEC_TO_TIME(seconds)&nbsp; <br>返回seconds参数，变换成小时、分钟和秒，值以'HH:MM:SS'或HHMMSS格式化，取决于函数是在一个字符串还是在数字 <br>上下文中被使用。&nbsp; <br>mysql&gt; select SEC_TO_TIME(2378);&nbsp; <br>-&gt; '00:39:38'&nbsp; <br>mysql&gt; select SEC_TO_TIME(2378) + 0;&nbsp; <br>-&gt; 3938&nbsp; </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">TIME_TO_SEC(time)&nbsp; <br>返回time参数，转换成秒。&nbsp; <br>mysql&gt; select TIME_TO_SEC('22:23:00');&nbsp; <br>-&gt; 80580&nbsp; <br>mysql&gt; select TIME_TO_SEC('00:39:38');&nbsp; <br>-&gt; 2378 </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;</p>
<img src ="http://www.cppblog.com/niewenlong/aggbug/58900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-08-15 00:28 <a href="http://www.cppblog.com/niewenlong/archive/2008/08/15/58900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装JAVA</title><link>http://www.cppblog.com/niewenlong/archive/2008/07/27/57299.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Sun, 27 Jul 2008 06:46:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/07/27/57299.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/57299.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/07/27/57299.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/57299.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/57299.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: Verdana"><br>jdk-6u10-beta-linux-i586-rpm.bin<br>[root@localhost java]# chmod a+x jdk-6u10-beta-linux-i586-rpm.bin<br>[root@localhost java]# ./jdk-6u10-beta-linux-i586-rpm.bin<br>Pre-Release Software Evaluation Agreement</p>
<p style="FONT-FAMILY: Verdana">SUN MICROSYSTEMS, INC. ("SUN") IS WILLING TO LICENSE<br>THE JAVA SE DEVELOPMENT KIT (JDK), VERSION 6<br>PRE-RELEASE SOFTWARE TO LICENSEE ONLY UPON THE<br>CONDITION THAT LICENSEE ACCEPTS ALL OF THE TERMS<br>CONTAINED IN THIS LICENSE AGREEMENT ("AGREEMENT").<br>PLEASE READ THE TERMS AND CONDITIONS OF THIS AGREEMENT<br>CAREFULLY. BY DOWNLOADING OR INSTALLING THIS SOFTWARE,<br>LICENSEE ACCEPTS THE TERMS AND CONDITIONS OF THIS<br>LICENSE AGREEMENT. INDICATE ACCEPTANCE BY SELECTING<br>THE "ACCEPT" BUTTON AT THE BOTTOM OF THIS AGREEMENT.<br>IF LICENSEE IS NOT WILLING TO BE BOUND BY ALL THE<br>TERMS, SELECT THE "DECLINE" BUTTON AT THE BOTTOM OF<br>THE AGREEMENT AND THE DOWNLOAD OR INSTALL PROCESS WILL<br>NOT CONTINUE.</p>
<p style="FONT-FAMILY: Verdana">1.0 DEFINITIONS "Licensed Software" means the Java SE<br>Development Kit (JDK), Version 6 pre-release software<br>in binary and/or source code forms, any other machine<br>readable materials (including, but not limited to,<br>libraries, source files, header files, and data<br>files), Feedback (as defined in Section 5.0), any user<br>manuals, programming guides and other documentation<br>provided to Licensee by Sun under this Agreement.</p>
<p style="FONT-FAMILY: Verdana">2.0 LIMITED LICENSE</p>
<p style="FONT-FAMILY: Verdana">2.1 Source Code. Sun grants to Licensee, a<br>non-exclusive, non-transferable, royalty-free and<br>limited license to view the source code portions of<br>the Licensed Software internally for the purposes of<br>evaluation only.</p>
<p style="FONT-FAMILY: Verdana">2.2 Binary Code. Sun grants to Licensee, a<br>non-exclusive, non-transferable, royalty-free and<br>limited license to use the binary code portions of the<br>Licensed Software internally for the purposes of<br>evaluation only.</p>
<p style="FONT-FAMILY: Verdana">2.3 No licenses are granted to Licensee for any other<br>purposes, Licensee may not sell, rent, loan or<br>otherwise encumber or transfer Licensed Software in<br>whole or in part, to any third party.</p>
<p style="FONT-FAMILY: Verdana">3.0 LICENSE RESTRICTIONS</p>
<p style="FONT-FAMILY: Verdana">3.1 Licensee may not duplicate Licensed Software other<br>than for a single copy of Licensed Software for<br>archival purposes only. Licensee agrees to reproduce<br>any copyright and other proprietary right notices on<br>any such copy.</p>
<p style="FONT-FAMILY: Verdana">3.2 Licensed Software is "Confidential Information".<br>Licensee may not disclose or use Confidential<br>Information, except for the purposes specified in this<br>Agreement. Licensee will protect the Confidential<br>Information with the same degree of care, as Licensee<br>uses to protect its own Confidential Information.</p>
<p style="FONT-FAMILY: Verdana">3.3 Except as otherwise provided by law, Licensee may<br>not modify or create derivative works of the Licensed<br>Software, or reverse engineer, disassemble or<br>decompile binary portions of the Licensed Software, or<br>otherwise attempt to derive the source code from such<br>portions.</p>
<p style="FONT-FAMILY: Verdana">3.4 No right, title, or interest in or to Licensed<br>Software, any trademarks, service marks, or trade<br>names of Sun or Sun's licensors is granted under this<br>Agreement.</p>
<p style="FONT-FAMILY: Verdana">3.5 Licensee shall have no right to use the Licensed<br>Software for productive or commercial use.</p>
<p style="FONT-FAMILY: Verdana">3.6&nbsp; Notwithstanding sections 3.1 and 3.3, and as a<br>special exception thereto, Licensee may use the files<br>from the Licensed Software with a virtual machine ("VM")<br>derived from the HotSpot Virtual Machine source code<br>("HotSpot") found at openjdk.dev.java.net.&nbsp; This<br>exception is subject to and conditioned upon the<br>following: (i) The VM was created in accordance with<br>the license terms governing "HotSpot";&nbsp; (ii) Any<br>activity under this exception is conducted solely<br>internally and for evaluation purposes only; and<br>(iii) Licensee is in compliance with all other terms<br>of this License.</p>
<p style="FONT-FAMILY: Verdana">4.0 NO SUPPORT Sun is under no obligation to support<br>Licensed Software or to provide Licensee with updates<br>or error corrections (collectively "Software<br>Updates"). If Sun, at its sole option, supplies<br>Software Updates to Licensee, the Software Updates<br>will be considered part of Licensed Software, and<br>subject to the terms of this Agreement.</p>
<p style="FONT-FAMILY: Verdana">5.0 LICENSEE DUTIES Licensee agrees to evaluate and<br>test the Software for use in Licensee's software<br>environment and provide feedback to Sun in a manner<br>reasonably requested by Sun. Any and all test results,<br>error data, reports or other information, feedback or<br>materials made or provided by Licensee relating to<br>Software (collectively, "Feedback") are the exclusive<br>property of Sun and Licensee hereby assigns all<br>Feedback to Sun at no cost to Sun. Sun may use such<br>Feedback in any manner and for any purpose, without<br>limitation, liability or obligation to Licensee.</p>
<p style="FONT-FAMILY: Verdana">6.0 TERM AND TERMINATION OF AGREEMENT</p>
<p style="FONT-FAMILY: Verdana">6.1 This Agreement will commence on the date on which<br>Licensee receives Licensed Software (the "Effective<br>Date") and will expire twelve (12) months from the<br>Effective Date, unless terminated earlier as provided<br>herein.</p>
<p style="FONT-FAMILY: Verdana">6.2 Either party may terminate this Agreement upon ten<br>(10) days' written notice to the other party. However,<br>Sun may terminate this Agreement immediately should<br>any Licensed Software become, or in Sun's opinion be<br>likely to become, the subject of a claim of<br>infringement of a patent, trade secret or copyright.</p>
<p style="FONT-FAMILY: Verdana">6.3 Sun may terminate this Agreement immediately<br>should Licensee materially breach any of its<br>provisions or take any action in derogation of Sun's<br>rights to the Confidential Information licensed to<br>Licensee.</p>
<p style="FONT-FAMILY: Verdana">6.4 Upon termination or expiration of this Agreement,<br>Licensee will immediately cease use of and destroy<br>Licensed Software, any copies thereof.</p>
<p style="FONT-FAMILY: Verdana">6.5 Rights and obligations under this Agreement which<br>by their nature should survive, will remain in effect<br>after termination or expiration hereof.</p>
<p style="FONT-FAMILY: Verdana">7.0 INSTALLATION AND AUTO-UPDATE.</p>
<p style="FONT-FAMILY: Verdana">The Software's installation and auto-update processes<br>transmit a limited amount of data to Sun (or its<br>service provider) about those specific processes to<br>help Sun understand and optimize them.&nbsp; Sun does not<br>associate the data with personally identifiable<br>information.&nbsp; You can find more information about the<br>data Sun collects at <a href="http://java.com/data/">http://java.com/data/</a>.</p>
<p style="FONT-FAMILY: Verdana">8.0 DISCLAIMER OF WARRANTY</p>
<p style="FONT-FAMILY: Verdana">8.1 Licensee acknowledges that Licensed Software may<br>contain errors and is not designed, licensed, or<br>intended for use in the design, construction,<br>operation or maintenance of any nuclear facility<br>("HighRisk Activities"). Sun disclaims any express or<br>implied warranty of fitness for such uses. Licensee<br>represents and warrants to Sun that it will not use,<br>distribute or license the Licensed Software for High<br>Risk Activities.</p>
<p style="FONT-FAMILY: Verdana">8.2 LICENSED SOFTWARE IS PROVIDED "AS IS". ALL EXPRESS<br>OR IMPLIED CONDITIONS, REPRESENTATIONS, AND<br>WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF<br>MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A<br>PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE<br>DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS<br>ARE HELD TO BE LEGALLY INVALID.</p>
<p style="FONT-FAMILY: Verdana">9.0 LIMITATION OF LIABILITY</p>
<p style="FONT-FAMILY: Verdana">9.1 Licensee acknowledges that the Licensed Software<br>may be experimental and that the Licensed Software may<br>have defects or deficiencies, which cannot or will not<br>be corrected by Sun. Licensee will hold Sun harmless<br>from any claims based on Licensee's use of the<br>Licensed Software for any purposes other than those of<br>internal evaluation, and from any claims that later<br>versions or releases of any Licensed Software<br>furnished to Licensee are incompatible with the<br>Licensed Software provided to Licensee under this<br>Agreement.</p>
<p style="FONT-FAMILY: Verdana">9.2 To the extent not prohibited by law, in no event<br>will Sun be liable for any indirect, punitive,<br>special, incidental or consequential damage in<br>connection with or arising out of this Agreement<br>(including loss of business, revenue, profits, use,<br>data or other economic advantage), however it arises,<br>whether for breach or in tort, even if Sun has been<br>previously advised of the possibility of such damage.</p>
<p style="FONT-FAMILY: Verdana">10.0 U.S. GOVERNMENT RESTRICTED RIGHTS If this Software<br>is being acquired by or on behalf of the U.S.<br>Government or by a U.S. Government prime contractor or<br>subcontractor (at any tier), then the Government's<br>rights in the Software and accompanying documentation<br>shall be only as set forth in this license; this is in<br>accordance with 48 C.F.R. 227.7202-4 (for Department<br>of Defense (DOD) acquisitions) and with 48 C.F.R.<br>2.101 and 12.212 (for non-DOD acquisitions).</p>
<p style="FONT-FAMILY: Verdana">11.0 GENERAL TERMS</p>
<p style="FONT-FAMILY: Verdana">11.1 Any action relating to or arising out of this<br>Agreement will be governed by California law and<br>controlling U.S. federal law. The U.N. Convention for<br>the International Sale of Goods and the choice of law<br>rules of any jurisdiction will not apply.</p>
<p style="FONT-FAMILY: Verdana">11.2 Licensed Software and technical data delivered<br>under this Agreement are subject to U.S. export<br>control laws and may be subject to export or import<br>regulations in other countries. Licensee agrees to<br>comply strictly with all such laws and regulations and<br>acknowledges that it has the responsibility to obtain<br>such licenses to export, re-export or import as may be<br>required after delivery to Licensee.</p>
<p style="FONT-FAMILY: Verdana">11.3 It is understood and agreed that, notwithstanding<br>any other provision of this Agreement, Licensee's<br>breach of this Agreement will cause Sun irreparable<br>damage for which recovery of money damages would be<br>inadequate, and that Sun will therefore be entitled to<br>seek timely injunctive relief to protect Sun's rights<br>under this Agreement in addition to any and all<br>remedies available at law.</p>
<p style="FONT-FAMILY: Verdana">11.4 Neither party may assign or otherwise transfer<br>any of its rights or obligations under this Agreement,<br>without the prior written consent of the other party,<br>except that Sun may assign this Agreement to an<br>affiliated company.</p>
<p style="FONT-FAMILY: Verdana">11.5 This Agreement is the parties' entire agreement<br>relating to its subject matter. It supersedes all<br>prior or contemporaneous oral or written<br>communications, proposals, conditions, representations<br>and warranties and prevails over any conflicting or<br>additional terms of any quote, order, acknowledgment,<br>or other communication between the parties relating to<br>its subject matter, including any Binary Code<br>Licenses, Supplemental Terms, or other licenses<br>contained within Licensed Software. No modification to<br>this Agreement will be binding, unless in writing and<br>signed by an authorized representative of each party.<br>(LFI#151319/Form ID#011801)</p>
<p style="FONT-FAMILY: Verdana"><br>Do you agree to the above license terms? [yes or no]</p>
<p style="FONT-FAMILY: Verdana">&nbsp;</p>
<p style="FONT-FAMILY: Verdana">&nbsp;</p>
<p style="FONT-FAMILY: Verdana">&nbsp;</p>
<p style="FONT-FAMILY: Verdana">&nbsp;</p>
<p style="FONT-FAMILY: Verdana"><br>yes<br>Unpacking...<br>Checksumming...<br>Extracting...<br>UnZipSFX 5.50 of 17 February 2002, by Info-ZIP (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#90;&#105;&#112;&#45;&#66;&#117;&#103;&#115;&#64;&#108;&#105;&#115;&#116;&#115;&#46;&#119;&#107;&#117;&#46;&#101;&#100;&#117;">Zip-Bugs@lists.wku.edu</a>).<br>&nbsp; inflating: jdk-6u10-beta-linux-i586.rpm<br>&nbsp; inflating: sun-javadb-common-10.4.1-3.1.i386.rpm<br>&nbsp; inflating: sun-javadb-core-10.4.1-3.1.i386.rpm<br>&nbsp; inflating: sun-javadb-client-10.4.1-3.1.i386.rpm<br>&nbsp; inflating: sun-javadb-demo-10.4.1-3.1.i386.rpm<br>&nbsp; inflating: sun-javadb-docs-10.4.1-3.1.i386.rpm<br>&nbsp; inflating: sun-javadb-javadoc-10.4.1-3.1.i386.rpm<br>Preparing...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ########################################### [100%]<br>&nbsp;&nbsp; 1:jdk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ########################################### [100%]<br>Unpacking JAR files...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rt.jar...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jsse.jar...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; charsets.jar...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tools.jar...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localedata.jar...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; plugin.jar...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javaws.jar...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deploy.jar...<br>Installing JavaDB<br>Preparing...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ########################################### [100%]<br>&nbsp;&nbsp; 1:sun-javadb-common&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ########################################### [ 17%]<br>&nbsp;&nbsp; 2:sun-javadb-core&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ########################################### [ 33%]<br>&nbsp;&nbsp; 3:sun-javadb-client&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ########################################### [ 50%]<br>&nbsp;&nbsp; 4:sun-javadb-demo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ########################################### [ 67%]<br>&nbsp;&nbsp; 5:sun-javadb-docs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ########################################### [ 83%]<br>&nbsp;&nbsp; 6:sun-javadb-javadoc&nbsp;&nbsp;&nbsp;&nbsp; ########################################### [100%]</p>
<p style="FONT-FAMILY: Verdana">Done.<br>[root@localhost java]# vi /etc/profile<br>[root@localhost java]# source /etc/profile</p>
<p style="FONT-FAMILY: Verdana">[root@localhost java]#<br>[root@localhost java]# env<br>KDE_MULTIHEAD=false<br>SSH_AGENT_PID=5201<br>HOSTNAME=localhost.localdomain<br>TERM=xterm<br>SHELL=/bin/bash<br>HISTSIZE=1000<br>GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/root/.gtkrc-2.0:/root/.kde/share/config/gtkrc-2.0<br>KDE_NO_IPV6=1<br>GTK_RC_FILES=/etc/gtk/gtkrc:/root/.gtkrc:/root/.kde/share/config/gtkrc<br>GS_LIB=/root/.fonts<br>WINDOWID=37748743<br>QTDIR=/usr/lib/qt-3.3<br>QTINC=/usr/lib/qt-3.3/include<br>KDE_FULL_SESSION=true<br>USER=root<br>LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:<br>SSH_AUTH_SOCK=/tmp/ssh-JCjHpF5168/agent.5168<br>KDEDIR=/usr<br>SESSION_MANAGER=local/localhost.localdomain:/tmp/.ICE-unix/5379<br>XDG_CONFIG_DIRS=/etc/kde/xdg:/etc/xdg<br>KONSOLE_DCOP=DCOPRef(konsole-5629,konsole)<br>MAIL=/var/spool/mail/root<br>PATH=/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/usr/java/jdk1.6.0_10/bin<br>DESKTOP_SESSION=kde<br>QT_IM_MODULE=scim<br>GDM_XSERVER_LOCATION=local<br>KONSOLE_DCOP_SESSION=DCOPRef(konsole-5629,session-1)<br>INPUTRC=/etc/inputrc<br>PWD=/usr/local/java<br>JAVA_HOME=/usr/java/jdk1.6.0_10<br><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#88;&#77;&#79;&#68;&#73;&#70;&#73;&#69;&#82;&#83;&#61;&#64;&#105;&#109;&#61;&#83;&#67;&#73;&#77;">XMODIFIERS=@im=SCIM</a><br>KDE_IS_PRELINKED=1<br>LANG=zh_CN.UTF-8<br>GDMSESSION=kde<br>XERCESCROOT=/home/soft/xerces-c-src_2_8_0<br>SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass<br>SHLVL=3<br>HOME=/root<br>XCURSOR_THEME=default<br>LOGNAME=root<br>QTLIB=/usr/lib/qt-3.3/lib<br>CVS_RSH=ssh<br>CLASSPATH=/usr/java/jdk1.6.0_10/lib:.<br>DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-FGw3oIRYzq,guid=7c118c48fd191781b3038c562a018700<br>LESSOPEN=|/usr/bin/lesspipe.sh %s<br>DISPLAY=:0.0<br>GTK_IM_MODULE=scim-bridge<br>G_BROKEN_FILENAMES=1<br>COLORTERM=<br>XAUTHORITY=/tmp/.gdmYVAKEU<br>_=/bin/env<br>[root@localhost java]# java -version<br>java version "1.4.2"<br>gij (GNU libgcj) version 4.1.2 20071124 (Red Hat 4.1.2-42)</p>
<p style="FONT-FAMILY: Verdana">Copyright (C) 2006 Free Software Foundation, Inc.<br>This is free software; see the source for copying conditions.&nbsp; There is NO<br>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.<br>[root@localhost java]#&nbsp;&nbsp;&nbsp;&nbsp; </p>
<img src ="http://www.cppblog.com/niewenlong/aggbug/57299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-07-27 14:46 <a href="http://www.cppblog.com/niewenlong/archive/2008/07/27/57299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Centos 快速yum 安装程序</title><link>http://www.cppblog.com/niewenlong/archive/2008/07/17/56445.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Thu, 17 Jul 2008 08:41:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/07/17/56445.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/56445.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/07/17/56445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/56445.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/56445.html</trackback:ping><description><![CDATA[<p>　　仅仅适用于 centos 5.0 以上系统(5.0下我没有测试)</p>
<p>　　因为Centos 5.0 的yum 版本已经上升到3,所以yum有个插件名叫</p>
<p>　　yum-fastestmirror</p>
<p>　　这个插件能检查到你机器最快的镜像</p>
<p>　　这个插件安装也很简单</p>
<p>　　yum -y install yum-fastestmirror</p>
<p>　　然后你再使用yum安装其他软件就会发现速度快多了</p>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/niewenlong/aggbug/56445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-07-17 16:41 <a href="http://www.cppblog.com/niewenlong/archive/2008/07/17/56445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to Install VMware Tools on Ubuntu Hardy 8.04 under VMware Fusion </title><link>http://www.cppblog.com/niewenlong/archive/2008/07/08/55666.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Tue, 08 Jul 2008 14:01:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/07/08/55666.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/55666.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/07/08/55666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/55666.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/55666.html</trackback:ping><description><![CDATA[<p><img alt="Ubuntu Hardy under VMware Fusion" src="http://peterc.org/wp-content/uploads/2008/04/vmwarefusionhardy.jpg"></p>
<p>The latest version of <a href="http://www.ubuntu.com/"><u><font color=#0000ff>Ubuntu</font></u></a> (8.04 a.k.a. Ubuntu Hardy - the world&#8217;s most popular Linux distribution) came out yesterday on April 24th. I downloaded it right away to play with on VMware Fusion, my Mac virtualization tool of choice (though I&#8217;ve now been told this works in VMware Workstation and VMware Player on the PC too!). It worked pretty well out of the box, with even seamless mouse support working right away, but I needed, of course, to install VMware Tools too, as any good VMware user would do. From there, things turned sour, and I was bombarded with error messages similar to:</p>
<blockquote>
<p><code><small>In file included from /tmp/vmware-config8/vmblock-only/linux/os.h:35,<br>from /tmp/vmware-config8/vmblock-only/linux/block.c:26:<br>/tmp/vmware-config8/vmblock-only/./include/compat_wait.h:78: error: conflicting types for &#8216;poll_initwait&#8217;<br>include/linux/poll.h:65: error: previous declaration of &#8216;poll_initwait&#8217; was here<br>In file included from /tmp/vmware-config8/vmblock-only/linux/vmblockInt.h:40,<br>from /tmp/vmware-config8/vmblock-only/linux/block.c:29:<br>/tmp/vmware-config8/vmblock-only/./include/vm_basic_types.h:184: error: conflicting types for &#8216;uintptr_t&#8217;<br>include/linux/types.h:40: error: previous declaration of &#8216;uintptr_t&#8217; was here<br>make[2]: *** [/tmp/vmware-config8/vmblock-only/linux/block.o] Error 1<br>make[1]: *** [_module_/tmp/vmware-config8/vmblock-only] Error 2<br>make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-16-generic&#8217;<br>make: *** [vmblock.ko] Error 2<br>make: Leaving directory `/tmp/vmware-config8/vmblock-only&#8217;<br>Unable to build the vmblock module.</small></code></p>
</blockquote>
<p>After banging my head against the wall for a while, trying a &#8220;vmware-any-any&#8221; patch that didn&#8217;t quite do the trick, and scouring the VMWare Fusion and Ubuntu Forums, I eventually came across a link to <a href="http://diamondsw.dyndns.org/Home/Et_Cetera/Entries/2008/4/25_Linux_2.6.24_and_VMWare.html"><u><font color=#0000ff>a page that described how to solve the problem.</font></u></a> The credit for this solution rests entirely on the guy who wrote that page and a guy called Mufassa who posted <a href="http://communities.vmware.com/message/887802#887802"><u><font color=#0000ff>a shorter explanation</font></u></a> to the VMware Fusion forums.</p>
<p>I wanted to write this up into a proper blog post though for two reasons. Firstly, I wanted to show how to fix the problem in a more, direct line by line way (just in case you&#8217;re a novice or would rather follow some command line instructions). Secondly, I know posts on this blog appear in Google very quickly, so I want people Googling for &#8220;vmware fusion&#8221; and &#8220;ubuntu hardy&#8221; (like I was earlier) to find this page and have their problem solved! So, credit to those other guys, but..</p>
<p><big><strong>Steps To Getting VMware Tools installed on Ubuntu Hardy under VMware Fusion:</strong></big></p>
<p>Use the &#8220;Install VMware Tools&#8221; option in VMWare Fusion, and drag the .tar file (not the RPM!) to the Ubuntu desktop.</p>
<p>Open a Terminal (Applications menu -&gt; Accessories -&gt; Terminal). We&#8217;ll do all the work from the Terminal. First, we need to install some dependencies:</p>
<blockquote>
<p><code>sudo apt-get install build-essential libgtk2.0-dev<br>sudo apt-get install libproc-dev libdumbnet-dev xorg-dev<br>cd Desktop/</code></p>
<p>wget http://mesh.dl.sourceforge.net/sourceforge/open-vm-tools/open-vm-tools-2008.04.14-87182.tar.gz</p>
</blockquote>
<p>Next, we need to unpack the tar files we have at hand:</p>
<blockquote>
<p><code>tar xzvf VMware*.gz<br>tar xzvf open-vm-tools*.gz</code></p>
</blockquote>
<p>Next, we&#8217;ll build the open-vm-tools:</p>
<blockquote>
<p><code>cd open-vm-tools-2008.04.14-87182/<br>./configure &amp;&amp; make<br>cd modules/linux/</code></p>
</blockquote>
<p>In the modules/linux folder we have the vmblock, vmhgfs, vmmemctl, vmsync and vmxnet modules that we need to tar up and place into the official VMware tools tarball:</p>
<blockquote>
<p><code>for i in *; do mv ${i} ${i}-only; tar -cf ${i}.tar ${i}-only; done<br>cd ../../..</code></p>
<p>mv -f open-vm-tools-2008.04.14-87182/modules/linux/*.tar vmware-tools-distrib/lib/modules/source/</p>
</blockquote>
<p>Now we can run the regular VMware tools installer:</p>
<blockquote>
<p><code>cd vmware-tools-distrib/<br>sudo ./vmware-install.pl</code></p>
</blockquote>
<p>Once this is done, the best tactic is to restart Ubuntu entirely. Once you boot back up, things should seem a bit smoother. The resolution of the VM will stick to the size of the VM, etc, and you can now drag files directly into Ubuntu Hardy from your Mac desktop!</p>
<p><em>Note: A few of the lines of code you need to use above are single lines of code but spread over multiple lines on your screen when viewing this blog. Either make your browser wider, or copy and paste them into a text editor before continuing.</em></p>
<br clear=left>
<img src ="http://www.cppblog.com/niewenlong/aggbug/55666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-07-08 22:01 <a href="http://www.cppblog.com/niewenlong/archive/2008/07/08/55666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VMware中安装Ubuntu后鼠标滚轮问题解决 </title><link>http://www.cppblog.com/niewenlong/archive/2008/07/08/55655.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Tue, 08 Jul 2008 10:59:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/07/08/55655.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/55655.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/07/08/55655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/55655.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/55655.html</trackback:ping><description><![CDATA[<div class=newmaincontent_newmain>　　Windows中通过VMware嵌套Ubuntu，发现鼠标滚轮功能不能使用。网上找了一下，都说是要将xorg.conf配置文件的问题，改动过程：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">sudo gedit /etc/X11/xorg.conf
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">将"Input Device" 这个section的
<p style="TEXT-INDENT: 2em">Option "Protocol" "ps/2"
<p style="TEXT-INDENT: 2em">替换为
<p style="TEXT-INDENT: 2em">Option "Protocol" "IMPS/2"
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">我的xorg.conf原来没有这个语句，就添加了。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">Ctrl+alt+backspace 重启X，还是没有效果。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">网上在查了下，发现我的配置还少了句：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">Option "Emulate3Buttons" "yes&#8220;
<p style="TEXT-INDENT: 2em">另外，我的驱动是: Driver "vmmouse"
<p style="TEXT-INDENT: 2em">而一般常见的是: Driver "mouse"
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">完整的配置段落：
<p style="TEXT-INDENT: 2em">Section "InputDevice"
<p style="TEXT-INDENT: 2em">Identifier "Configured Mouse"
<p style="TEXT-INDENT: 2em">Driver "vmmouse"
<p style="TEXT-INDENT: 2em">Option "Protocol" "ImPS/2"
<p style="TEXT-INDENT: 2em">Option "CorePointer"
<p style="TEXT-INDENT: 2em">Option "Device" "/dev/input/mice"
<p style="TEXT-INDENT: 2em">Option "ZAxisMapping" "4 5"
<p style="TEXT-INDENT: 2em">Option "Emulate3Buttons" "yes"
<p style="TEXT-INDENT: 2em">EndSection
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"></p>
</div>
<img src ="http://www.cppblog.com/niewenlong/aggbug/55655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-07-08 18:59 <a href="http://www.cppblog.com/niewenlong/archive/2008/07/08/55655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++) </title><link>http://www.cppblog.com/niewenlong/archive/2008/07/02/55158.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Wed, 02 Jul 2008 09:19:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/07/02/55158.html</guid><description><![CDATA[<p><strong style="FONT-SIZE: 14pt"><span style="FONT-SIZE: 10pt">A.&nbsp;为什么要在Linux使用Eclipse开发C/C++程序?</span>&nbsp;</strong><br><br>Linux是一个以C/C++开发为主的平台，无论是Kernel或是Application，主要都使用C/C++开发。传统在Linux下开发程序，是在文字模式下，利用vi等文字编辑器撰写C/C++程序存盘后，在Command line下使用gcc编译，若要debug，则使用gdb。<br><br><br></p>
<p>这种开发方式生产力并不高，若只是开发学习用的小程序则影响不大，但若要开发大型项目时，程序档案个数众多，需要用project或solution的方式管理；且debug时breakpoint的加入，单步执行，观察变量变化等，都需要更可视化的方式才能够增加生产力；最重要的，由于现在的程序语言皆非常的庞大，又有复杂的函式库，要程序员熟记所有的程序语法和function名称，实在很困难，所以语法提示(Intellisense)的功能就非常重要，这些就必须靠IDE来达成。</p>
<p><br>在Windows平台上，若要开发C/C++程序，我们有Microsoft Visual Studio、Borland C++ Builder可用，这些都是很好用的IDE，但可惜仅能在Windows下使用，但是在Linux平台呢?基于以下理由，我推荐使用Eclipse开发C/C++程序：<br><br><br>1.&nbsp;Eclipse是一个用Java所撰写IDE，因此可跨平台，所以在Linux和Windows平台下皆可使用Eclipse，可降低程序员熟析IDE的学习曲线。<br><br><br>2.&nbsp;Eclipse虽然主要拿来开发Java程序，但事实上Eclipse为一个『万用语言』的IDE，只要挂上plugin后，就可以在Eclipse开发各种语言程序，所以我们只要挂上CDT(C/C++ Development Toolkit)后，就可以在Eclipse开发C/C++程序，除此之外，目前的主流程序语言，如C/C++、C#、Java、PHP、Perl、Python、Ruby、Rebol、JavaScript、SQL、XML、UML等，皆可在Eclipse上撰写，所以只要熟析Eclipse的IDE环境，将来若开发其它语言程序，就不用再重新学习IDE环境了。<br><br><br>3.&nbsp;最重要的，Eclipse和CDT是Open Source且完全免费，取得相当容易，事实上Fedora 5已经包含Eclipse和CDT了，虽然预设Fedara 5安装时并没有含Eclipse，只要手动另外加选即可。</p>
<p><br><strong style="FONT-SIZE: 10pt">B.&nbsp;如何在Linux下安装Eclipse和CDT?</strong>&nbsp; <br>i.&nbsp;由Linux Distribution安装Eclipse，Fedora 5就内含Eclipse和CDT。<br><br>ii.&nbsp;手动安装<br>&nbsp; 1.&nbsp;下载档案<br>&nbsp;&nbsp;&nbsp; A、&nbsp;下载JRE(Java Runtime Environment) 。(<a href="http://java.sun.com/javase/downloads/index.jsp" target=_blank><u><font color=#810081>http://java.sun.com/javase/downloads/index.jsp</font></u></a>)<br><br>&nbsp;&nbsp;&nbsp; B、&nbsp;下载Eclipse SDK。(<a href="http://www.eclipse.org/downloads/" target=_blank><u><font color=#810081>http://www.eclipse.org/downloads/</font></u></a>)<br><br>&nbsp;&nbsp;&nbsp; C、&nbsp;下载CDT。(<a href="http://www.eclipse.org/cdt/downloads.php" target=_blank><u><font color=#810081>http://www.eclipse.org/cdt/downloads.php</font></u></a>)<br><br>&nbsp; 2.&nbsp;安装<br>&nbsp;&nbsp;&nbsp; <strong>A、&nbsp;安装JRE</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i.&nbsp;[root@localhost ~]#mkdir /usr/local/java<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ii.&nbsp;<span style="COLOR: #008000">(将档案jre-1_5_0_09-linux-i586-rpm.bin下载到/usr/local/java目录下)<br></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iii.&nbsp;<span style="COLOR: #008000">(超级用户模式)<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [root@localhost ~]#su&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iv.&nbsp; [root@localhost ~]#cd /usr/java<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.&nbsp;<span style="COLOR: #008000">(将您所下载的档的权限更改为可执行)<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [root@localhost java]#chmod a+x jre-1_5_0_09-linux-i586-rpm.bin&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vi.&nbsp;<span style="COLOR: #008000">(启动安装过程) </span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [root@localhost java]#./jre-1_5_0_09-linux-i586-rpm.bin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008000">(此时将显示二进制许可协议，按控格显示下一页，读完许可协议后，输入 『yes』继续安装。此时会将解压缩，产生jre-1_5_0_9-linux-i586.rpm)<br><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/JRE1.jpg" border=0><br><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vii. <span style="COLOR: #008000">(安装jre-1_5_0_9-linux-i586.rpm)</span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [root@localhost java]#rpm &#8211;ivh jre-1_5_0_9-linux-i586.rpm <br><img height=235 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/JRE2.jpg" width=574 border=0><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008000">(此时会将JRE装在/usr/java/jre1.5.0_09目录下)<br></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; viii.&nbsp;<span style="COLOR: #008000">(设定环境变量，让Linux能找到JRE)<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [root@localhost java]#vi /etc/profile<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008000">(将以下内容加入在档案后面)</span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">PATH</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">$PATH:</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">java</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">jre1.</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">.0_09</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">bin<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>export&nbsp;JAVA_HOME</span><span style="COLOR: #000000">=/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">java</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">jre1.</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">.0_09<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>export&nbsp;CLASSPATH</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">$JAVA_HOME</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib:.</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008000">(存盘后，重新启动Linux)<br><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ix.&nbsp;<span style="COLOR: #008000">(测试Java是否安装成功)<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [root@localhost ~]#java &#8211;version<br><img height=164 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/JRE3.jpg" width=665 border=0><br><br>&nbsp;&nbsp;&nbsp;<strong> B、&nbsp;安装Eclipse SDK</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i.&nbsp;<span style="COLOR: #008000">(将档案eclipse-SDK-3.2.1-linux-gtk.tar.gz下载到桌面)<br><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ii.&nbsp;[root@localhost ~]#cd /usr/local<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iii.&nbsp;[root@localhost local]#cp ~Desktop/eclipse-SDK-3.2.1-linux-gtk.tar.gz .&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iv.<span style="COLOR: #008000">&nbsp;(将eclipse-SDK-3.2.1-linux-gtk.tar.gz解压缩)</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [root@localhost local]#tar &#8211;zxvf eclipse-SDK-3.2.1-linux-gtk.tar.gz<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.&nbsp;[root@localhost local]#cd eclipse<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vi.&nbsp;<span style="COLOR: #008000">(执行Eclipse)<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [root@localhost eclipse]#./eclipse<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vii.&nbsp;<span style="COLOR: #008000">(Select a workspace)<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008000">(将Use this as the default and do not ask again打勾，以后就不会出现这个窗口)<br><img height=319 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/Eclipse1.jpg" width=704 border=0><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (第一次执行Eclipse会出现此error，因为没有任何Eclipse设定档，所以无法读取，第二次执行Eclipse就无此错误讯息，按OK继续。)<br><img height=184 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/Eclipse2.jpg" width=701 border=0><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Eclipse主画面)<br><img height=549 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/Eclipse3.jpg" width=800 border=0><br><br></span>&nbsp;&nbsp;&nbsp; <strong>C、 安装CDT</strong> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i. <span style="COLOR: #008000">(将档案org.eclipse.cdt-3.1.1-linux.x86.tar.gz下载到桌面)</span> <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ii. [root@localhost ~]#cp ~/Desktop/org.eclipse.cdt-3.1.1-linux.x86.tar.gz . <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iii. <span style="COLOR: #008000">(将org.eclipse.cdt-3.1.1-linux.x86.tar.gz解压缩)</span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [root@localhost ~]#tar &#8211;zxvf org.eclipse.cdt-3.1.1-linux.x86.tar.gz<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008000">(档案将解到~/eclipse目录下)</span> <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iv. <span style="COLOR: #008000">(安装CDT plugin)<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [root@localhost ~]cp &#8211;r eclipse/plugins/. /usr/local/eclipse/plugins/ <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v. <span style="COLOR: #008000">(启动Eclipse，多了C和C++ Project支持)</span>&nbsp;<br>&nbsp;&nbsp;&nbsp; <img height=499 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/CDT1.jpg" width=700 border=0><br><br><span>C.&nbsp;<strong>如何在Eclipse上开发C/C++程序?</strong></span><br><strong>i.&nbsp;建立Hello Word project</strong><br>&nbsp; 1.&nbsp;建立C/C++ project<br><img height=156 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/HelloWorld1.jpg" width=468 border=0><br><br>&nbsp; 2.&nbsp;选择Managed Make C++ Project(若选择Managed Make C++ Project，Eclipse会自动为我们建立make file；若选择Standard Make C++ Project，则必须自己写make file。)<br><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/HelloWorld2.jpg" border=0><br><br>&nbsp; 3.&nbsp;输入Project name<br><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/HelloWorld3.jpg" border=0><br><br>&nbsp; 4.&nbsp;选择Project类型(如执行档或Library，这里选择执行档即可)<br><img height=498 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/HelloWorld4.jpg" width=700 border=0><br><br>&nbsp; 5.&nbsp;额外的设定<br><img height=499 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/HelloWorld5.jpg" width=700 border=0><br><br>&nbsp; 6.&nbsp;Open Associated Perspective?(选Yes继续)<br><img height=498 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/HelloWorld6.jpg" width=699 border=0><br><br>&nbsp; 7.&nbsp;建立C++ Source File<br><img height=308 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/HelloWorld7.jpg" width=577 border=0><br><br>8.&nbsp;输入C++ Source File檔名<br><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/HelloWorld8.jpg" border=0><br><br>&nbsp; 9.&nbsp;输入C++程序代码<br><img height=550 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/HelloWorld9.jpg" width=799 border=0><br><br>&nbsp; 10.&nbsp;执行程序(显示在下方的Console区)<br><img height=548 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/HelloWorld10.jpg" width=799 border=0><br><br><strong>ii.&nbsp;如何在Eclipse CDT中Debug C/C++程序?</strong><br>1.&nbsp;在Eclipse中Debug，就如同在一般IDE中Debug一样，只要在程序代码的左方按两下，就可加入breakpoint。<br><img height=547 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/Debug1.jpg" width=799 border=0><br><br>&nbsp; 2.&nbsp;启动Debug<br><img height=547 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/Debug2.jpg" width=798 border=0><br><br>&nbsp; 3.&nbsp;Debug设定，按Debug开始Debug<br><img height=550 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/Debug3.jpg" width=800 border=0><br><br>&nbsp; 4.&nbsp;单步执行，显示变量变化<br><img height=548 alt="" src="http://www.cnblogs.com/images/cnblogs_com/oomusou/Debug4.jpg" width=798 border=0><br><br><span style="FONT-SIZE: 12pt"><strong>E.&nbsp;结论<br></strong></span>Eclipse为Linux在C/C++开发提供一个完善的IDE环境，事实上，以我用过众多IDE的经验，除了Visual Studio最方便外，Eclipse的好用也直追Visual Studio，并且超越Borland C++ Builder及Dev C++，虽然安装上比较麻烦，但只要依照本文介绍一步一步的设定，就一定可完成Eclipse设定，若想要在Windows平台使用gcc compiler，也建议使用Eclipse + CDT + MinGW的组合。<br><br><strong>See Also</strong> <br><a href="http://www.cnblogs.com/oomusou/archive/2006/11/10/557066.html"><u><font color=#0000ff>[转载] Eclipse + CDT + MinGW 安装方法</font></u></a></p>
<p><strong>Reference <br></strong>1.&nbsp;为Linux手动下载和安装Java Runtime Enrironment(JRE)的说明<br>(<a href="http://www.java.com/zh_CN/download/help/5000010500.xml" target=_blank><u><font color=#0000ff>http://www.java.com/zh_CN/download/help/5000010500.xml</font></u></a>)<br>2.&nbsp;Eclipse 3.0 CDT on Linux<br>(<a href="http://www.autexier.de/jmau/dev/CDT/cdt.html" target=_blank><u><font color=#0000ff>http://www.autexier.de/jmau/dev/CDT/cdt.html</font></u></a>)</p>
<img src ="http://www.cppblog.com/niewenlong/aggbug/55158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-07-02 17:19 <a href="http://www.cppblog.com/niewenlong/archive/2008/07/02/55158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何导出mysql 数据结构</title><link>http://www.cppblog.com/niewenlong/archive/2008/07/02/55119.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Wed, 02 Jul 2008 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/07/02/55119.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/55119.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/07/02/55119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/55119.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/55119.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: mysqldump   -d   -uroot   -p   database>databaseStr.sql   <br>  -d   ：只要结构   <br>  -p   ：输入密码   <br>  -uroot   :   用户为root   <br>  database>databaseStr.sql   把database   数据库的结构生成为文件   databaseStr.sql&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2008/07/02/55119.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/55119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-07-02 10:36 <a href="http://www.cppblog.com/niewenlong/archive/2008/07/02/55119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX新手入门及安装配置FAQ</title><link>http://www.cppblog.com/niewenlong/archive/2008/06/15/53364.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Sun, 15 Jun 2008 12:25:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/06/15/53364.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/53364.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/06/15/53364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/53364.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/53364.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 入门篇安装篇Q：如何制作安装磁盘? 你可以使用两中方法制作安装磁盘。在M$-DOS下，可以使用专门为其开发的rawrite命令（安装光盘\dosutils下），将boot.img（安装光盘\images下）映像文件传输到软盘上；在linux下可以用命令dd，但不要把软驱设备mount入系统。具体语法如下： e:\&gt;e:\dosutils\rawrite Enter disk images s...&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2008/06/15/53364.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/53364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-06-15 20:25 <a href="http://www.cppblog.com/niewenlong/archive/2008/06/15/53364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>添加静态路由 </title><link>http://www.cppblog.com/niewenlong/archive/2008/06/09/52610.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Sun, 08 Jun 2008 22:13:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/06/09/52610.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/52610.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/06/09/52610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/52610.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/52610.html</trackback:ping><description><![CDATA[<p>route<br>route命令来配置并查看内核路由表的配置情况。<br>例如：<br>（1） 添加到主机的路由。<br>#route add &#8211;host 192.168.200.145 dev eth0:0<br>#route add &#8211;host 210.26.24.12 gw 210.26.24.100<br>（2） 添加到网络的路由。<br>#route add &#8211;net 192.168.200.145 netmask 255.255.255.0 eth0<br>#route add &#8211;net 192.168.200.145 netmask 255.255.255.0 gw 210.26.24.98<br>#route add &#8211;net 192.168.1.0/24 eth1<br>#route add -net 192.168.200.0/24 gw 210.26.24.100<br>（3） 添加默认网关。<br>#route add default gw 192.168.200.98<br>（4） 查看内核路由表的配置。<br>#route<br>（5）删除路由。<br>#route del &#8211;host 192.168.200.145 dev eth0:0<br>#route del &#8211;host 192.168.200.0/24 gw 192.168.200.100<br>#route del &#8211;net 210.26.25.145 netmask 255.255.255.0 eth0<br>#route del &#8211;net 210.26.24.98 netmask 255.255.255.248 gw 210.26.24.126<br>#route del &#8211;net 192.168.200.0/24 eth1<br>#route del default gw 192.168.200.100<br>#route del -net 192.168.200.0/24 gw 210.26.24.100<br>3、 traceroute<br>traceroute命令显示数据包到达目的主机所经过的路由。<br>例如：<br>#traceroute<br><a title=www.tsnc.edu.cn href="http://www.tsnc.edu.cn/"><u><font color=#0000ff>www.tsnc.edu.cn</font></u></a></p>
<img src ="http://www.cppblog.com/niewenlong/aggbug/52610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-06-09 06:13 <a href="http://www.cppblog.com/niewenlong/archive/2008/06/09/52610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How do I restart Linux network service?</title><link>http://www.cppblog.com/niewenlong/archive/2008/06/09/52587.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Sun, 08 Jun 2008 17:08:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/06/09/52587.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/52587.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/06/09/52587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/52587.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/52587.html</trackback:ping><description><![CDATA[<p><strong>RedHat Linux</strong> command to reload or restart network (login as root user):</p>
<p><code># service network restart</code><br>OR<br><code># /etc/init.d/network restart</code></p>
<p>To start Linux network service:<br><code><strong># service network start</strong></code></p>
<p>To stop Linux network service:<br><code><strong># service network stop</strong></code></p>
<p><strong>Debian Linux</strong> command to reload or restart network:<br><code><strong># /etc/init.d/networking restart</strong></code></p>
<p>To start Linux network service:<br><code><strong># /etc/init.d/networking start</strong></code></p>
<p>To stop Linux network service:<br><code><strong># /etc/init.d/networking stop</strong></code></p>
<p><strong>Ubuntu Linux </strong>user use sudo command with above Debian Linux command:<br><code><strong># sudo /etc/init.d/networking restart</strong></code></p>
<p>To start Linux network service:<br><code><strong># sudo /etc/init.d/networking start</strong></code></p>
<p>To stop Linux network service:<br><code><strong># sudo /etc/init.d/networking stop</strong></code></p>
<script type=text/javascript><!--
google_ad_client = "pub-7825705102693166";
/* TheOS.IN-336x280, created 5/10/08 */
google_ad_slot = "5264551900";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</script>
<img src ="http://www.cppblog.com/niewenlong/aggbug/52587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-06-09 01:08 <a href="http://www.cppblog.com/niewenlong/archive/2008/06/09/52587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Halt or stop linux firewall</title><link>http://www.cppblog.com/niewenlong/archive/2008/06/09/52586.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Sun, 08 Jun 2008 17:07:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/06/09/52586.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/52586.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/06/09/52586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/52586.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/52586.html</trackback:ping><description><![CDATA[<p>A firewall is designed to help protect your computer from attack by malicious users or by malicious software (viruses that use unsolicited incoming network traffic to attack). </p>
<p>Also before you disable your firewall, you must disconnect your computer from all networks, including the Internet to avoid damage <img class=wp-smiley alt=:D src="http://theos.in/wp-includes/images/smilies/icon_biggrin.gif"> </p>
<p>You would like to Halt linux firewall or stop linux firewall (i.e. flush iptables rules). First login as root user.</p>
<h3>Option A - If you are redhat Linux user type command:</h3>
<p>If you are using Red Hat (RHEL) / CentOS / Fedora Core Linux, use the following command:</p>
<pre><strong>/etc/init.d/iptables stop</strong></pre>
<p>OR</p>
<pre><strong>service iptables stop</strong></pre>
<h3>Option B - If you are Debian Linux user type following commands one by one</h3>
<pre>iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT</pre>
<script type=text/javascript><!--
google_ad_client = "pub-7825705102693166";
/* TheOS.IN-336x280, created 5/10/08 */
google_ad_slot = "5264551900";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</script>
<img src ="http://www.cppblog.com/niewenlong/aggbug/52586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-06-09 01:07 <a href="http://www.cppblog.com/niewenlong/archive/2008/06/09/52586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How Do I Restart MySQL Server?</title><link>http://www.cppblog.com/niewenlong/archive/2008/06/09/52585.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Sun, 08 Jun 2008 17:06:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/06/09/52585.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/52585.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/06/09/52585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/52585.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/52585.html</trackback:ping><description><![CDATA[<p>Each distribution comes with shell script (read as service) to restart mysql server. First login as root user and open shell prompt (command prompt).</p>
<p>First login as root user. Now type the following command as per your Linux distro:</p>
<h3>A) If you are using mysql on RedHat Linux (Fedora Core/Cent OS) then use following command:</h3>
<p>* To start mysql server:<br><code><strong># /etc/init.d/mysqld start</strong></code></p>
<p>* To stop mysql server:<br><code><strong># /etc/init.d/mysqld stop</strong></code></p>
<p>* To restart mysql server<br><code><strong># /etc/init.d/mysqld restart</strong></code></p>
<p>Tip: Redhat Linux also supports service command, which can be use to start, restart, stop any service:<br><code># service mysqld start<br># service mysqld stop<br># service mysqld restart</code></p>
<h3>(B) If you are using mysql on Debian Linux then use following command:</h3>
<p>* To start mysql server:<br><code><strong># /etc/init.d/mysql start</strong></code></p>
<p>* To stop mysql server:<br><code><strong># /etc/init.d/mysql stop</strong></code></p>
<p>* To restart mysql server<br><strong># /etc/init.d/mysql restart</strong></p>
<p>More MySQL articles are <a href="http://www.cyberciti.biz/tips/category/mysql"><u><font color=#0000ff>here</font></u></a> and <a href="http://www.cyberciti.biz/faq/category/faq/"><u><font color=#0000ff>here</font></u></a>.</p>
<img src ="http://www.cppblog.com/niewenlong/aggbug/52585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-06-09 01:06 <a href="http://www.cppblog.com/niewenlong/archive/2008/06/09/52585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RHEL5.1DVD 、RHEL4.6-DVD下载</title><link>http://www.cppblog.com/niewenlong/archive/2008/06/09/52584.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Sun, 08 Jun 2008 16:45:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/06/09/52584.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/52584.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/06/09/52584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/52584.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/52584.html</trackback:ping><description><![CDATA[<div id=art style="MARGIN: 15px" width="100%">
<div><font face=宋体 color=#ff0000 size=5>以下资讯转载请注明出处<a href="http://blog.chinaunix.net/u2/63432/showart_520017.html"><font color=#ff0000 size=3><u>http://blog.chinaunix.net/u2/63432/showart_520017.html</u></font></a></font></div>
<div>&nbsp;</div>
<div><a href="http://rhel.ieesee.net/uingei/RHEL4.6-i386-AS-DVD.iso" target=_blank></a>&nbsp;</div>
<div>5.1 i386<br><a href="http://linux.ifensi.com/redhat/rhel5/rhel-5.1-server-i386-dvd.iso"><u><font color=#0000ff>http://linux.ifensi.com/redhat/rhel5/rhel-5.1-server-i386-dvd.iso</font></u></a><br>5.1 x64<br><a href="http://linux.ifensi.com/redhat/rhel5/rhel-5.1-server-x86_64-dvd.iso"><u><font color=#0000ff>http://linux.ifensi.com/redhat/rhel5/rhel-5.1-server-x86_64-dvd.iso</font></u></a><a href="https://rhn.redhat.com/download/1207562146/b6c99a72ce214f3f47d608bffd9a372fd04e1170/3860587/25063/rhn/isos/RHEL5.1/rhel-x86_64-server-5/rhel-5.1-server-x86_64-dvd.iso"></a><br>4.6 i386<br><a href="https://rhn.redhat.com/download/1207562297/4db573214323e683d3425079ad2b431678a954a2/3860587/25544/rhn/isos/RHEL4.6-DVD/rhel-i386-as-4/RHEL4.6-i386-AS-DVD.iso"></a><a href="http://rhel.ieesee.net/uingei/RHEL4.6-i386-AS-DVD.iso" target=_blank><font color=#0000ff><u>http://rhel.ieesee.net/uingei/RHEL4.6-i386-AS-DVD.iso</u></font></a><br>4.6 x64<br><a href="http://rhel.ieesee.net/uingei/RHEL4.6-x86_64-AS-DVD.iso" target=_blank><u><font color=#0000ff>http://rhel.ieesee.net/uingei/RHEL4.6-x86_64-AS-DVD.iso</font></u></a></div>
<div>&nbsp;</div>
<div>RedHat Enterprise Linux 5&nbsp;&nbsp;安装 序列号<br><br>Server:<br><br>* Red Hat Enterprise Linux (Server including virtualization):<br>2515dd4e215225dd<br><br>+ Red Hat Enterprise Linux Virtualization Platform:<br>49af89414d147589<br><br>Client:<br><br>* Red Hat Enterprise Linux Desktop:<br>660266e267419c67<br><br>+ Red Hat Enterprise Linux Desktop + Workstation Option:<br>da3122afdb7edd23<br><br>+ Red Hat Enterprise Linux Desktop + Workstation + DualOS Option<br>(Virtualization):<br>7fcc43557e9bbc42<br><br>+ Red Hat Enterprise Linux Desktop + DualOS Option (Virtualization):<br>fed67649ff918c77</div>
<div></div>
<div></div>
</div>
<img src ="http://www.cppblog.com/niewenlong/aggbug/52584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-06-09 00:45 <a href="http://www.cppblog.com/niewenlong/archive/2008/06/09/52584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下如何修改ip地址</title><link>http://www.cppblog.com/niewenlong/archive/2008/06/05/52277.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Thu, 05 Jun 2008 10:30:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/06/05/52277.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/52277.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/06/05/52277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/52277.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/52277.html</trackback:ping><description><![CDATA[<p><strong><font color=#33cccc>最简单的方法，输入setup，配置界面就出来了～<br>或者跟一般Linux一样，在/etc/sysconfig/network-scripts下找到ifcfg-eth0文件，编辑：<br>DEVICE=eth0<br>IPADDR=192.168.0.254<br>域名服务器配置文件：/etc/ resolv.conf</font></strong></p>
<p><strong><font color=#33cccc>以下方法，可使修改直接生效：<br>修改ip地址<br># ifconfig eth0 192.168.0.20 netmask 255.255.255.0</font></strong></p>
<p><strong><font color=#33cccc>修改default gateway<br># route add default gw 192.168.0.254</font></strong></p>
<p><strong><font color=#33cccc>修改dns<br>修改/etc/resolv.conf</font></strong></p>
<p><strong><font color=#33cccc>修改host name<br># hostname fc2<br>启动生效:<br>修改/etc/sysconfig/network</font></strong></p>
<p><br>&nbsp;</p>
<p><br>&nbsp;</p>
<p><span class=w_deepbrown>ifconfig eth0 新ip<br>然后编辑/etc/sysconfig/network-scripts/ifcfg-eth0，修改ip<br><br>[aeolus@db1 network-scripts]$ vi ifcfg-eth0 <br><br>DEVICE=eth0<br>ONBOOT=yes<br>BOOTPROTO=static<br>IPADDR=219.136.241.211<br>NETMASK=255.255.255.128<br>GATEWAY=219.136.241.254<br><br>[aeolus@db1 etc]$ vi resolv.conf <br><br>nameserver 202.96.128.68<br>nameserver 219.136.241.206<br><br>－－－－－－－－－－－－－－－－－－－－－－－<br>Linux下修改网卡IP和网关<br><br><br>建议通过终端字符方式下来修改<br>一修改IP地址<br>vi /etc/sysconfig/network-scripts/ifcfg-eth0<br>DEVICE=eth0<br>BOOTPROTO=none<br>BROADCAST=192.168.1.255<br>IPADDR=192.168.1.33<br>NETMASK=255.255.255.0<br>NETWORK=192.168.1.0<br>ONBOOT=yes<br>USERCTL=no<br>PEERDNS=no<br>TYPE=Ethernet<br>~<br><br>vi /etc/sysconfig/network-scripts/ifcfg-eth1<br><br>DEVICE=eth1<br>ONBOOT=yes<br>BOOTPROTO=none<br>IPADDR=192.168.2.34<br>NETMASK=255.255.255.0<br>USERCTL=no<br>PEERDNS=no<br>TYPE=Ethernet<br>NETWORK=192.168.2.0<br>BROADCAST=192.168.2.255<br>二修改网关<br>vi /etc/sysconfig/network<br><br>NETWORKING=yes<br>HOSTNAME=Aaron<br>GATEWAY=192.168.1.1<br><br>三重新启动网络配置<br>/etc/init.d/network restart<br><br><br><br>-----------------------------------------------------------------------------------<br><br>修改配置文件<br><br>/etc/sysconfig/network-scripts/ 下有配置文件<br><br>比如文件：ifcfg-eth0 代表是以太网实际网卡0的配置文件<br><br>比如文件：ifcfg-eth0:1 代表是以太网实际网卡0的配置文件<br><br>域名服务器配置文件：/etc/ resolv.conf<br><br>修改ip地址<br>即时生效:<br># ifconfig eth0 192.168.0.20 netmask 255.255.255.0<br>启动生效:<br>修改/etc/sysconfig/network-scripts/ifcfg-eth0<br><br>修改default gateway<br>即时生效:<br># route add default gw 192.168.0.254<br>启动生效:<br>修改/etc/sysconfig/network-scripts/ifcfg-eth0<br><br>修改dns<br>修改/etc/resolv.conf<br>修改后可即时生效，启动同样有效<br><br>修改host name<br>即时生效:<br># hostname fc2<br>启动生效:<br>修改/etc/sysconfig/network<br><br></span></p>
<p><span class=w_deepbrown><br></span>&nbsp;</p>
<p><span class=w_deepbrown><br></span>&nbsp;</p>
<span class=w_deepbrown>
<h1>在Linux的系统下如何才能修改IP信息</h1>
<div id=sh><a href="http://www.soft6.com/comment-f4-i68919.html"><u><font color=#0000ff></font></u></a>&nbsp;</div>
<div id=memo>
<p>以前总是用ifconfig修改，重启后总是得重做。如果修改配置文件，就不用那么麻烦了～ </p>
<p>A、修改ip地址 </p>
<p>即时生效: </p>
<p># ifconfig eth0 192.168.0.20 netmask 255.255.255.0 </p>
<p>启动生效: </p>
<p>修改/etc/sysconfig/network-s/ifcfg-eth0 </p>
<p>B、修改default gateway </p>
<p>即时生效: </p>
<p># route add default gw 192.168.0.254 </p>
<p>启动生效: </p>
<p>修改/etc/sysconfig/network-s/ifcfg-eth0 </p>
<p>C、修改dns </p>
<p>修改/etc/resolv.conf </p>
<p>修改后可即时生效，启动同样有效 </p>
<p>D、修改host name </p>
<p>即时生效: </p>
<p># hostname fc2 </p>
<p>启动生效: </p>
<p>修改/etc/sysconfig/network </p>
<p>新启动网络配置 </p>
<p>/etc/init.d/network restart </p>
<p>前提： Redhat 系统 </p>
<p>ip, 掩码： </p>
<p>编辑 /etc/sysconfig/network-script/ifcfg-eth0 <br>IPADDR=192.168.0.1 <br>NETMASK=255.255.255.0 </p>
<p>网关： </p>
<p>编辑 /etc/sysconfig/network <br>NETWORKING=yes <br>HOSTNAME=xx <br>GATEWAY=192.168.0.100 <br>DNS： </p>
<p>编辑 /etc/resolv.conf <br>NAMESERVER=202.96.209.5 <br>注意：上述IP地址都要改成与你的网络配置相对应的IP地址。</p>
</div>
</span>
<img src ="http://www.cppblog.com/niewenlong/aggbug/52277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-06-05 18:30 <a href="http://www.cppblog.com/niewenlong/archive/2008/06/05/52277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FC9下VMtools的安装</title><link>http://www.cppblog.com/niewenlong/archive/2008/06/04/52154.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Wed, 04 Jun 2008 07:14:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/06/04/52154.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: FC9下VMtools的安装&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2008/06/04/52154.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/52154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-06-04 15:14 <a href="http://www.cppblog.com/niewenlong/archive/2008/06/04/52154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fedora 9安装说明</title><link>http://www.cppblog.com/niewenlong/archive/2008/06/02/51890.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Mon, 02 Jun 2008 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/06/02/51890.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Fedora 9安装说明&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2008/06/02/51890.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/51890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-06-02 16:45 <a href="http://www.cppblog.com/niewenlong/archive/2008/06/02/51890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为VMware里的linux增加新分区 </title><link>http://www.cppblog.com/niewenlong/archive/2007/05/16/24178.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Tue, 15 May 2007 16:44:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2007/05/16/24178.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/24178.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2007/05/16/24178.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/24178.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/24178.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: VMware里linux没有空间了，需要增加新的分区。<br><br>VMware: 5.0.0 build-13124<br>linux: 2.4.20-8<br><br>操作步骤：<br><br>1. 给linux所在的虚拟机增加一块硬盘。<br>   虚拟机->设置->添加, 根据增加硬件向导的提示进行操作即可为虚拟机添加第二块硬盘,硬盘类型选择SCSI。<br><br>2. 在linux分区并格式化<br>   1) 分区<br>      fdisk /dev/sdb<br>      <br>      fdisk在/sbin目录下。<br>      <br>   2) 格式化分区<br>      mkfs.ext3 /dev/sdb1<br>      出现错误:<br>      /dev/sdb1: Not enough space to build proposed filesystem while setting up superblock<br><br>      后来发现问题出在分区上：分区时仅将sdb分为一个扩展&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2007/05/16/24178.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/24178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2007-05-16 00:44 <a href="http://www.cppblog.com/niewenlong/archive/2007/05/16/24178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vmware下调整linux的分辨率</title><link>http://www.cppblog.com/niewenlong/archive/2007/05/09/23703.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Wed, 09 May 2007 05:55:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2007/05/09/23703.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/23703.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2007/05/09/23703.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/23703.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/23703.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: vmware下调整linux的分辨率&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2007/05/09/23703.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/23703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2007-05-09 13:55 <a href="http://www.cppblog.com/niewenlong/archive/2007/05/09/23703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GNU make 指南 </title><link>http://www.cppblog.com/niewenlong/archive/2007/05/08/23630.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Tue, 08 May 2007 08:31:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2007/05/08/23630.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/23630.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2007/05/08/23630.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/23630.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/23630.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;翻译： 哈少 <br>&nbsp;&nbsp;&nbsp;&nbsp;译者按： 本文是一篇介绍 GNU Make 的文章，读完后读者应该基本掌握了 make 的用法。而 make 是所有想在 Unix （当然也包括 Linux ）系统上编程的用户必须掌握的工具。如果你写的程序中没有用到 make ，则说明你写的程序只是个人的练习程序，不具有任何实用的价值。也许这么说有点儿偏激，但 make 实在是应该用在任何稍具规模的程序中的。希望本文可以为中国的 Unix 编程初学者提供一点儿有用的资料。中国的 Linux 用户除了学会安装红帽子以外， 实在应该尝试写一些有用的程序。个人想法，大家参考。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;C-Scene 题目 #2 <br>&nbsp;&nbsp;&nbsp;&nbsp;多文件项目和 GNU Make 工具 <br>&nbsp;&nbsp;&nbsp;&nbsp;作者: 乔治富特 (Goerge Foot) <br>&nbsp;&nbsp;&nbsp;&nbsp;电子邮件: george.foot@merton.ox.ac.uk <br>&nbsp;&nbsp;&nbsp;&nbsp;Occupation: Student at Merton College, Oxford University, England <br>&nbsp;&nbsp;&nbsp;&nbsp;职业:学生，默尔顿学院,牛津城大学,英格兰 <br>&nbsp;&nbsp;&nbsp;&nbsp;IRC匿名: gfoot <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;拒绝承诺：作者对于任何因此而对任何事物造成的所有损害（你所拥有或不 拥有的实际的，抽象的，或者虚拟的）。所有的损坏都是你自己的责任，而 与我无关。 <br>&nbsp;&nbsp;&nbsp;&nbsp;所有权： &#8220;多文件项目&#8221;部分属于作者的财产，版权归乔治富特１９９７年 五月至七月。其它部分属 CScene 财产，版权 CScene １９９７年，保留所有 版权。本 CScene 文章的分发，部分或全部，应依照所有其它 CScene 的文章 的条件来处理。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;0) 介绍 <br>&nbsp;&nbsp;&nbsp;&nbsp;~~~~~~~~~~~~~~~ <br>&nbsp;&nbsp;&nbsp;&nbsp;本文将首先介绍为什么要将你的Ｃ源代码分离成几个合理的独立档案，什么时 候需要分，怎么才能分的好。然后将会告诉你 GNU Make 怎样使你的编译和连 接步骤自动化。对于其它 Make 工具的用户来说，虽然在用其它类似工具时要 做适当的调整，本文的内容仍然是非常有用的。如果对你自己的编程工具有怀 疑，可以实际的试一试，但请先阅读用户手册。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;1) 多文件项目 <br>&nbsp;&nbsp;&nbsp;&nbsp;~~~~~~~~~~~~~~~~~~~~~~ <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;1.1为什么使用它们? <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;首先，多文件项目的好处在那里呢？ <br>&nbsp;&nbsp;&nbsp;&nbsp;它们看起来把事情弄的复杂无比。又要 header 文件，又要 extern 声明，而且如果需要查找一个文件，你要在更多的文件里搜索。 <br>&nbsp;&nbsp;&nbsp;&nbsp;但其实我们有很有力的理由支持我们把一个项目分解成小块。当你改 动一行代码，编译器需要全部重新编译来生成一个新的可执行文件。 但如果你的项目是分开在几个小文件里，当你改动其中一个文件的时 候，别的源文件的目标文件(object files)已经存在，所以没有什么 原因去重新编译它们。你所需要做的只是重现编译被改动过的那个文 件，然后重新连接所有的目标文件罢了。在大型的项目中，这意味着 从很长的（几分钟到几小时）重新编译缩短为十几，二十几秒的简单 调整。 <br>&nbsp;&nbsp;&nbsp;&nbsp;只要通过基本的规划，将一个项目分解成多个小文件可使你更加容易 的找到一段代码。很简单，你根据代码的作用把你的代码分解到不同 的文件里。当你要看一段代码时，你可以准确的知道在那个文件中去 寻找它。 <br>&nbsp;&nbsp;&nbsp;&nbsp;从很多目标文件生成一个程序包 (Library)比从一个单一的大目标文件 生成要好的多。当然实际上这是否真是一个优势则是由你所用的系统 来决定的。但是当使用 gcc/ld (一个 GNU C 编译／连接器) 把一个程 序包连接到一个程序时，在连接的过程中，它会尝试不去连接没有使 用到的部分。但它每次只能从程序包中把一个完整的目标文件排除在 外。因此如果你参考一个程序包中某一个目标档中任何一个符号的话， 那么这个目标文件整个都会被连接进来。要是一个程序包被非常充分 的分解了的话，那么经连接后，得到的可执行文件会比从一个大目标 文件组成的程序包连接得到的文件小得多。 <br>&nbsp;&nbsp;&nbsp;&nbsp;又因为你的程序是很模块化的，文件之间的共享部分被减到最少，那 就有很多好处——可以很容易的追踪到臭虫，这些模块经常是可以用 在其它的项目里的，同时别人也可以更容易的理解你的一段代码是干 什么的。当然此外还有许多别的好处&#8230;&#8230; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;1.2 何时分解你的项目 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;很明显，把任何东西都分解是不合理的。象&#8220;世界，你们好&#8221;这样的 简单程序根本就不能分，因为实在也没什么可分的。把用于测试用的 小程序分解也是没什么意思的。但一般来说，当分解项目有助于布局、 发展和易读性的时候，我都会采取它。在大多数的情况下，这都是适 用的。（所谓&#8220;世界，你们好&#8221;，既 'hello world' ，只是一个介 绍一种编程语言时惯用的范例程序，它会在屏幕上显示一行 'hello world' 。是最简单的程序。） <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;如果你需要开发一个相当大的项目，在开始前，应该考虑一下你将 如何实现它，并且生成几个文件（用适当的名字）来放你的代码。 当然，在你的项目开发的过程中，你可以建立新的文件，但如果你 这么做的话，说明你可能改变了当初的想法，你应该想想是否需要 对整体结构也进行相应的调整。 <br>&nbsp;&nbsp;&nbsp;&nbsp;对于中型的项目，你当然也可以采用上述技巧，但你也可以就那么开 始输入你的代码，当你的码多到难以管理的时候再把它们分解成不同 的档案。但以我的经验来说，开始时在脑子里形成一个大概的方案， 并且尽量遵从它，或在开发过程中，随着程序的需要而修改，会使开 发变得更加容易。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;1.3 怎样分解项目 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;先说明，这完全是我个人的意见，你可以（也许你真的会？）用别的 方式来做。这会触动到有关编码风格的问题，而大家从来就没有停止 过在这个问题上的争论。在这里我只是给出我自己喜欢的做法（同时 也给出这么做的原因）： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;i) 不要用一个 header 文件指向多个源码文件（例外：程序包 的 header 文件）。用一个 header定义一个源码文件的方式 会更有效，也更容易查寻。否则改变一个源文件的结构（并且 它的 header 文件）就必须重新编译好几个文件。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;ii) 如果可以的话，完全可以用超过一个的 header 文件来指向同 一个源码文件。有时将不可公开调用的函数原型，类型定义 等等，从它们的Ｃ源码文件中分离出来是非常有用的。使用一 个 header 文件装公开符号，用另一个装私人符号意味着如果 你改变了这个源码文件的内部结构，你可以只是重新编译它而 不需要重新编译那些使用它的公开 header 文件的其它的源文 件。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;iii) 不要在多个 header 文件中重复定义信息。 如果需要， 在其中一个 header 文件里 #include 另一个，但 是不要重复输入相同的 header 信息两次。原因是如果你以后改 变了这个信息，你只需要把它改变一次，不用搜索并改变另外一 个重复的信息。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;iv) 在每一个源码文件里， #include 那些声明了源码文件中的符 号的所有 header 文件。这样一来，你在源码文件和 header 文件对某些函数做出的矛盾声明可以比较容易的被编译器发现。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;1.4 对于常见错误的注释 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;a) 定义符 (Identifier) 在源码文件中的矛盾：在Ｃ里，变量和函数的缺 省状态是公用的。因此，任何Ｃ源码档案都可以引用存在于其它源 码档中的通用 (global) 函数和通用变量，既使这个档案没有那个变 量或函数的声明或原型。因此你必须保证在不同的两个档案里不能 用同一个符号名称，否则会有连接错误或者在编译时会有警告。 <br>&nbsp;&nbsp;&nbsp;&nbsp;一种避免这种错误的方法是在公用的符号前加上跟其所在源文件有 关的前缀。比如：所有在 gfx.c 里的函数都加上前缀&#8220;gfx_&#8221;。如果 你很小心的分解你的程序，使用有意义的函数名称，并且不是过分 使用通用变量，当然这根本就不是问题。 <br>&nbsp;&nbsp;&nbsp;&nbsp;要防止一个符号在它被定义的源文件以外被看到，可在它的定义前 加上关键字&#8220;static&#8221;。这对只在一个档案内部使用，其它档案都 都不会用到的简单函数是很有用的。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;b) 多次定义的符号： header 档会被逐字的替换到你源文件里 #include 的位置的。因此，如果 header 档被 #include 到一个以上的源文件 里，这个 header 档中所有的定义就会出现在每一个有关的源码文件 里。这会使它们里的符号被定义一次以上，从而出现连接错误（见 上）。 <br>&nbsp;&nbsp;&nbsp;&nbsp;解决方法： 不要在 header 档里定义变量。你只需要在 header 档里声明它们然后在适当的Ｃ源码文件（应该 #include 那个 header 档的那个）里定义它们（一次）。对于初学者来说，定义和声明是 很容易混淆的。声明的作用是告诉编译器其所声明的符号应该存在， 并且要有所指定的类型。但是，它并不会使编译器分配贮存空间。 而定义的做用是要求编译器分配贮存空间。当做一个声明而不是做 定义的时候，在声明前放一个关键字&#8220;extern&#8221;。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;例如，我们有一个叫&#8220;counter&#8221;的变量，如果想让它成为公用的， 我们在一个源码程序（只在一个里面）的开始定义它：&#8220;int counter;&#8221;，再在相关的 header 档里声明它：&#8220;extern int counter;&#8221;。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;函数原型里隐含着 extern 的意思，所以不需顾虑这个问题。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;c) 重复定义，重复声明，矛盾类型： <br>&nbsp;&nbsp;&nbsp;&nbsp;请考虑如果在一个Ｃ源码文件中 #include 两个档 a.h 和 b.h， 而 a.h 又 #include 了 b.h 档（原因是 b.h 档定义了一些 a.h 需要的类型），会发生什么事呢？这时该Ｃ源码文件 #include 了 b.h 两次。因此每一个在 b.h 中的 #define 都发生了两次，每一 个声明发生了两次，等等。理论上，因为它们是完全一样的拷贝， 所以应该不会有什么问题，但在实际应用上，这是不符合Ｃ的语法 的，可能在编译时出现错误，或至少是警告。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;解决的方法是要确定每一个 header 档在任一个源码文件中只被包 含了一次。我们一般是用预处理器来达到这个目的的。当我们进入 每一个 header 档时，我们为这个 header 档 #define 一个巨集 指令。只有在这个巨集指令没有被定义的前提下，我们才真正使用 该 header 档的主体。在实际应用上，我们只要简单的把下面一段 码放在每一个 header 档的开始部分： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;#ifndef FILENAME_H <br>&nbsp;&nbsp;&nbsp;&nbsp;#define FILENAME_H <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;然后把下面一行码放在最后： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;#endif <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;用 header 档的档名（大写的）代替上面的 FILENAME_H，用底线 代替档名中的点。有些人喜欢在 #endif 加上注释来提醒他们这个 #endif 指的是什么。例如： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;#endif /* #ifndef FILENAME_H */ <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;我个人没有这个习惯，因为这其实是很明显的。当然这只是各人的 风格不同，无伤大雅。 <br>&nbsp;&nbsp;&nbsp;&nbsp;你只需要在那些有编译错误的 header 档中加入这个技巧，但在所 有的 header 档中都加入也没什么损失，到底这是个好习惯。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;1.5 重新编译一个多文件项目 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;清楚的区别编译和连接是很重要的。编译器使用源码文件来产生某种 形式的目标文件(object files)。在这个过程中，外部的符号参考并 没有被解释或替换。然后我们使用连接器来连接这些目标文件和一些 标准的程序包再加你指定的程序包，最后连接生成一个可执行程序。 在这个阶段，一个目标文件中对别的文件中的符号的参考被解释，并 报告不能被解释的参考，一般是以错误信息的形式报告出来。 <br>&nbsp;&nbsp;&nbsp;&nbsp;基本的步骤就应该是，把你的源码文件一个一个的编译成目标文件的格 式，最后把所有的目标文件加上需要的程序包连接成一个可执行文件。 具体怎么做是由你的编译器决定的。这里我只给出 gcc （GNU C 编译 器）的有关命令，这些有可能对你的非 gcc 编译器也适用。 <br>&nbsp;&nbsp;&nbsp;&nbsp;gcc 是一个多目标的工具。它在需要的时候呼叫其它的元件（预处理 程序，编译器，组合程序，连接器）。具体的哪些元件被呼叫取决于 输入文件的类型和你传递给它的开关。 <br>&nbsp;&nbsp;&nbsp;&nbsp;一般来说，如果你只给它Ｃ源码文件，它将预处理，编译，组合所有 的文件，然后把所得的目标文件连接成一个可执行文件（一般生成的 文件被命名为 a.out ）。你当然可以这么做，但这会破坏很多我们 把一个项目分解成多个文件所得到的好处。 <br>&nbsp;&nbsp;&nbsp;&nbsp;如果你给它一个 -c 开关，gcc 只把给它的文件编译成目标文件， 用源码文件的文件名命名但把其后缀由&#8220;.c&#8221;或&#8220;.cc&#8221;变成&#8220;.o&#8221;。 如果你给它的是一列目标文件， gcc 会把它们连接成可执行文件， 缺省文件名是 a.out 。你可以改变缺省名，用开关 -o 后跟你指定 的文件名。 <br>&nbsp;&nbsp;&nbsp;&nbsp;因此，当你改变了一个源码文件后，你需要重新编译它： 'gcc -c filename.c' 然后重新连接你的项目： 'gcc -o exec_filename *.o'。 如果你改变了一个 header 档，你需要重新编译所有 #include 过 这个档的源码文件，你可以用 'gcc -c file1.c file2.c file3.c' 然后象上边一样连接。 <br>&nbsp;&nbsp;&nbsp;&nbsp;当然这么做是很繁琐的，幸亏我们有些工具使这个步骤变得简单。 本文的第二部分就是介绍其中的一件工具：GNU Make 工具。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;（好家伙，现在才开始见真章。您学到点儿东西没？） <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;2) GNU Make 工具 <br>&nbsp;&nbsp;&nbsp;&nbsp;~~~~~~~~~~~~~~~~ <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;2.1 基本 makefile 结构 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;GNU Make 的主要工作是读进一个文本文件， makefile 。这个文 件里主要是有关哪些文件（&#8216;target&#8217;目的文件）是从哪些别的 文件（&#8216;dependencies&#8217;依靠文件）中产生的，用什么命令来进行 这个产生过程。有了这些信息， make 会检查磁碟上的文件，如果 目的文件的时间戳（该文件生成或被改动时的时间）比至少它的一 个依靠文件旧的话， make 就执行相应的命令，以便更新目的文件。 （目的文件不一定是最后的可执行档，它可以是任何一个文件。） <br>&nbsp;&nbsp;&nbsp;&nbsp;makefile 一般被叫做&#8220;makefile&#8221;或&#8220;Makefile&#8221;。当然你可以 在 make 的命令行指定别的文件名。如果你不特别指定，它会寻 找&#8220;makefile&#8221;或&#8220;Makefile&#8221;，因此使用这两个名字是最简单 的。 <br>&nbsp;&nbsp;&nbsp;&nbsp;一个 makefile 主要含有一系列的规则，如下： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;: ... <br>&nbsp;&nbsp;&nbsp;&nbsp;(tab)<command></command> <br>&nbsp;&nbsp;&nbsp;&nbsp;(tab)<command></command> <br>&nbsp;&nbsp;&nbsp;&nbsp;. <br>&nbsp;&nbsp;&nbsp;&nbsp;. <br>&nbsp;&nbsp;&nbsp;&nbsp;. <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;例如，考虑以下的 makefile ： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;=== makefile 开始 === <br>&nbsp;&nbsp;&nbsp;&nbsp;myprog : foo.o bar.o <br>&nbsp;&nbsp;&nbsp;&nbsp; gcc foo.o bar.o -o myprog <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;foo.o : foo.c foo.h bar.h <br>&nbsp;&nbsp;&nbsp;&nbsp; gcc -c foo.c -o foo.o <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;bar.o : bar.c bar.h <br>&nbsp;&nbsp;&nbsp;&nbsp; gcc -c bar.c -o bar.o <br>&nbsp;&nbsp;&nbsp;&nbsp;=== makefile 结束 === <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;这是一个非常基本的 makefile —— make 从最上面开始，把上 面第一个目的，&#8216;myprog&#8217;，做为它的主要目标（一个它需要保 证其总是最新的最终目标）。给出的规则说明只要文件&#8216;myprog&#8217; 比文件&#8216;foo.o&#8217;或&#8216;bar.o&#8217;中的任何一个旧，下一行的命令将 会被执行。 <br>&nbsp;&nbsp;&nbsp;&nbsp;但是，在检查文件 foo.o 和 bar.o 的时间戳之前，它会往下查 找那些把 foo.o 或 bar.o 做为目标文件的规则。它找到的关于 foo.o 的规则，该文件的依靠文件是 foo.c, foo.h 和 bar.h 。 它从下面再找不到生成这些依靠文件的规则，它就开始检查磁碟 上这些依靠文件的时间戳。如果这些文件中任何一个的时间戳比 foo.o 的新，命令 'gcc -o foo.o foo.c' 将会执行，从而更新 文件 foo.o 。 <br>&nbsp;&nbsp;&nbsp;&nbsp;接下来对文件 bar.o 做类似的检查，依靠文件在这里是文件 bar.c 和 bar.h 。 <br>&nbsp;&nbsp;&nbsp;&nbsp;现在， make 回到&#8216;myprog&#8217;的规则。如果刚才两个规则中的任 何一个被执行，myprog 就需要重建（因为其中一个 .o 档就会比 &#8216;myprog&#8217;新），因此连接命令将被执行。 <br>&nbsp;&nbsp;&nbsp;&nbsp;希望到此，你可以看出使用 make 工具来建立程序的好处——前 一章中所有繁琐的检查步骤都由 make 替你做了：检查时间戳。 你的源码文件里一个简单改变都会造成那个文件被重新编译（因 为 .o 文件依靠 .c 文件），进而可执行文件被重新连接（因为 .o 文件被改变了）。其实真正的得益是在当你改变一个 header 档的时候——你不再需要记住那个源码文件依靠它，因为所有的 资料都在 makefile 里。 make 会很轻松的替你重新编译所有那 些因依靠这个 header 文件而改变了的源码文件，如有需要，再 进行重新连接。 <br>&nbsp;&nbsp;&nbsp;&nbsp;当然，你要确定你在 makefile 中所写的规则是正确无误的，只 列出那些在源码文件中被 #include 的 header 档&#8230;&#8230; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;2.2 编写 make 规则 (Rules) <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;最明显的（也是最简单的）编写规则的方法是一个一个的查 看源码文件，把它们的目标文件做为目的，而Ｃ源码文件和被它 #include 的 header 档做为依靠文件。但是你也要把其它被这些 header 档 #include 的 header 档也列为依靠文件，还有那些被 包括的文件所包括的文件&#8230;&#8230;然后你会发现要对越来越多的文件 进行管理，然后你的头发开始脱落，你的脾气开始变坏，你的脸 色变成菜色，你走在路上开始跟电线杆子碰撞，终于你捣毁你的 电脑显示器，停止编程。到低有没有些容易点儿的方法呢？ <br>&nbsp;&nbsp;&nbsp;&nbsp;当然有！向编译器要！在编译每一个源码文件的时候，它实在应 该知道应该包括什么样的 header 档。使用 gcc 的时候，用 -M 开关，它会为每一个你给它的Ｃ文件输出一个规则，把目标文件 做为目的，而这个Ｃ文件和所有应该被 #include 的 header 文 件将做为依靠文件。注意这个规则会加入所有 header 文件，包 括被角括号(`&lt;', `&gt;')和双引号(`"')所包围的文件。其实我们可以 相当肯定系统 header 档（比如 stdio.h, stdlib.h 等等）不会 被我们更改，如果你用 -MM 来代替 -M 传递给 gcc，那些用角括 号包围的 header 档将不会被包括。（这会节省一些编译时间） <br>&nbsp;&nbsp;&nbsp;&nbsp;由 gcc 输出的规则不会含有命令部分；你可以自己写入你的命令 或者什么也不写，而让 make 使用它的隐含的规则（参考下面的 2.4 节）。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;2.3 Makefile 变量 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;上面提到 makefiles 里主要包含一些规则。它们包含的其它的东 西是变量定义。 <br>&nbsp;&nbsp;&nbsp;&nbsp;makefile 里的变量就像一个环境变量(environment variable)。 事实上，环境变量在 make 过程中被解释成 make 的变量。这些 变量是大小写敏感的，一般使用大写字母。它们可以从几乎任何 地方被引用，也可以被用来做很多事情，比如： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;i) 贮存一个文件名列表。在上面的例子里，生成可执行文件的 规则包含一些目标文件名做为依靠。在这个规则的命令行 里同样的那些文件被输送给 gcc 做为命令参数。如果在这 里使用一个变数来贮存所有的目标文件名，加入新的目标 文件会变的简单而且较不易出错。 <br>&nbsp;&nbsp;&nbsp;&nbsp;ii) 贮存可执行文件名。如果你的项目被用在一个非 gcc 的系 统里，或者如果你想使用一个不同的编译器，你必须将所 有使用编译器的地方改成用新的编译器名。但是如果使用一 个变量来代替编译器名，那么你只需要改变一个地方，其 它所有地方的命令名就都改变了。 <br>&nbsp;&nbsp;&nbsp;&nbsp;iii) 贮存编译器旗标。假设你想给你所有的编译命令传递一组 相同的选项（例如 -Wall -O -g）；如果你把这组选项存 入一个变量，那么你可以把这个变量放在所有呼叫编译器 的地方。而当你要改变选项的时候，你只需在一个地方改 变这个变量的内容。 <br>&nbsp;&nbsp;&nbsp;&nbsp;要设定一个变量，你只要在一行的开始写下这个变量的名字，后 面跟一个 = 号，后面跟你要设定的这个变量的值。以后你要引用 这个变量，写一个 $ 符号，后面是围在括号里的变量名。比如在 下面，我们把前面的 makefile 利用变量重写一遍： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;=== makefile 开始 === <br>&nbsp;&nbsp;&nbsp;&nbsp;OBJS = foo.o bar.o <br>&nbsp;&nbsp;&nbsp;&nbsp;CC = gcc <br>&nbsp;&nbsp;&nbsp;&nbsp;CFLAGS = -Wall -O -g <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;myprog : $(OBJS) <br>&nbsp;&nbsp;&nbsp;&nbsp; $(CC) $(OBJS) -o myprog <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;foo.o : foo.c foo.h bar.h <br>&nbsp;&nbsp;&nbsp;&nbsp; $(CC) $(CFLAGS) -c foo.c -o foo.o <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;bar.o : bar.c bar.h <br>&nbsp;&nbsp;&nbsp;&nbsp; $(CC) $(CFLAGS) -c bar.c -o bar.o <br>&nbsp;&nbsp;&nbsp;&nbsp;=== makefile 结束 === <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;还有一些设定好的内部变量，它们根据每一个规则内容定义。三个 比较有用的变量是 $@, $&lt;和 $^ （这些变量不需要括号括住）。 $@ 扩展成当前规则的目的文件名， $&lt; 扩展成依靠列表中的第 一个依靠文件，而 $^ 扩展成整个依靠的列表（除掉了里面所有重 复的文件名）。利用这些变量，我们可以把上面的 makefile 写成： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;=== makefile 开始 === <br>&nbsp;&nbsp;&nbsp;&nbsp;OBJS = foo.o bar.o <br>&nbsp;&nbsp;&nbsp;&nbsp;CC = gcc <br>&nbsp;&nbsp;&nbsp;&nbsp;CFLAGS = -Wall -O -g <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;myprog : $(OBJS) <br>&nbsp;&nbsp;&nbsp;&nbsp; $(CC) $^ -o $@ <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;foo.o : foo.c foo.h bar.h <br>&nbsp;&nbsp;&nbsp;&nbsp; $(CC) $(CFLAGS) -c $&lt;-o $@ <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;bar.o : bar.c bar.h <br>&nbsp;&nbsp;&nbsp;&nbsp; $(CC) $(CFLAGS) -c $&lt;-o $@ <br>&nbsp;&nbsp;&nbsp;&nbsp;=== makefile 结束 === <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;你可以用变量做许多其它的事情，特别是当你把它们和函数混合 使用的时候。如果需要更进一步的了解，请参考 GNU Make 手册。 ('man make', 'man makefile') <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;2.4 隐含规则 (Implicit Rules) <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;请注意，在上面的例子里，几个产生 .o 文件的命令都是一样的。 都是从 .c 文件和相关文件里产生 .o 文件，这是一个标准的步 骤。其实 make 已经知道怎么做——它有一些叫做隐含规则的内 置的规则，这些规则告诉它当你没有给出某些命令的时候，应该 怎么办。 <br>&nbsp;&nbsp;&nbsp;&nbsp;如果你把生成 foo.o 和 bar.o 的命令从它们的规则中删除， make 将会查找它的隐含规则，然后会找到一个适当的命令。它的命令会 使用一些变量，因此你可以按照你的想法来设定它：它使用变量 CC 做为编译器（象我们在前面的例子），并且传递变量 CFLAGS （给 C 编译器，C++ 编译器用 CXXFLAGS ），CPPFLAGS （ C 预 处理器旗标）， TARGET_ARCH （现在不用考虑这个），然后它加 入旗标 '-c' ，后面跟变量 $&lt;（第一个依靠名），然后是旗 标 '-o' 跟变量 $@ （目的文件名）。一个Ｃ编译的具体命令将 会是： <br>&nbsp;&nbsp;&nbsp;&nbsp;$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $&lt;-o $@ <br>&nbsp;&nbsp;&nbsp;&nbsp;当然你可以按照你自己的需要来定义这些变量。这就是为什么用 gcc 的 -M 或 -MM 开关输出的码可以直接用在一个 makefile 里。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;2.5 假象目的 (Phony Targets) <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;假设你的一个项目最后需要产生两个可执行文件。你的主要目标 是产生两个可执行文件，但这两个文件是相互独立的——如果一 个文件需要重建，并不影响另一个。你可以使用&#8220;假象目的&#8221;来 达到这种效果。一个假象目的跟一个正常的目的几乎是一样的， 只是这个目的文件是不存在的。因此， make 总是会假设它需要 被生成，当把它的依赖文件更新后，就会执行它的规则里的命令 行。 <br>&nbsp;&nbsp;&nbsp;&nbsp;如果在我们的 makefile 开始处输入： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;all : exec1 exec2 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;其中 exec1 和 exec2 是我们做为目的的两个可执行文件。 make 把这个 'all' 做为它的主要目的，每次执行时都会尝试把 'all' 更新。但既然这行规则里没有哪个命令来作用在一个叫 'all' 的 实际文件（事实上 all 并不会在磁碟上实际产生），所以这个规 则并不真的改变 'all' 的状态。可既然这个文件并不存在，所以 make 会尝试更新 all 规则，因此就检查它的依靠 exec1, exec2 是否需要更新，如果需要，就把它们更新，从而达到我们的目的。 <br>&nbsp;&nbsp;&nbsp;&nbsp;假象目的也可以用来描述一组非预设的动作。例如，你想把所有由 make 产生的文件删除，你可以在 makefile 里设立这样一个规则： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;veryclean : <br>&nbsp;&nbsp;&nbsp;&nbsp; rm *.o <br>&nbsp;&nbsp;&nbsp;&nbsp; rm myprog <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;前提是没有其它的规则依靠这个 'veryclean' 目的，它将永远 不会被执行。但是，如果你明确的使用命令 'make veryclean' ， make 会把这个目的做为它的主要目标，执行那些 rm 命令。 <br>&nbsp;&nbsp;&nbsp;&nbsp;如果你的磁碟上存在一个叫 veryclean 文件，会发生什么事？这 时因为在这个规则里没有任何依靠文件，所以这个目的文件一定是 最新的了（所有的依靠文件都已经是最新的了），所以既使用户明 确命令 make 重新产生它，也不会有任何事情发生。解决方法是标 明所有的假象目的（用 .PHONY），这就告诉 make 不用检查它们 是否存在于磁碟上，也不用查找任何隐含规则，直接假设指定的目 的需要被更新。在 makefile 里加入下面这行包含上面规则的规则： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;.PHONY : veryclean <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;就可以了。注意，这是一个特殊的 make 规则，make 知道 .PHONY 是一个特殊目的，当然你可以在它的依靠里加入你想用的任何假象 目的，而 make 知道它们都是假象目的。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;2.6 函数 (Functions) <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;makefile 里的函数跟它的变量很相似——使用的时候，你用一个 $ 符号跟开括号，函数名，空格后跟一列由逗号分隔的参数，最后 用关括号结束。例如，在 GNU Make 里有一个叫 'wildcard' 的函 数，它有一个参数，功能是展开成一列所有符合由其参数描述的文 件名，文件间以空格间隔。你可以像下面所示使用这个命令： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;SOURCES = $(wildcard *.c) <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;这行会产生一个所有以 '.c' 结尾的文件的列表，然后存入变量 SOURCES 里。当然你不需要一定要把结果存入一个变量。 <br>&nbsp;&nbsp;&nbsp;&nbsp;另一个有用的函数是 patsubst （ patten substitude, 匹配替 换的缩写）函数。它需要３个参数——第一个是一个需要匹配的式样，第二个表示用什么来替换它，第三个是一个需要被处理的 由空格分隔的字列。例如，处理那个经过上面定义后的变量， <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;OBJS = $(patsubst %.c,%.o,$(SOURCES)) <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;这行将处理所有在 SOURCES 字列中的字（一列文件名），如果它的 结尾是 '.c' ，就用 '.o' 把 '.c' 取代。注意这里的 % 符号将匹 配一个或多个字符，而它每次所匹配的字串叫做一个&#8216;柄&#8217;(stem) 。 在第二个参数里， % 被解读成用第一参数所匹配的那个柄。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;2.7 一个比较有效的 makefile <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;利用我们现在所学的，我们可以建立一个相当有效的 makefile 。 这个 makefile 可以完成大部分我们需要的依靠检查，不用做太大 的改变就可直接用在大多数的项目里。 <br>&nbsp;&nbsp;&nbsp;&nbsp;首先我们需要一个基本的 makefile 来建我们的程序。我们可以让 它搜索当前目录，找到源码文件，并且假设它们都是属于我们的项 目的，放进一个叫 SOURCES 的变量。这里如果也包含所有的 *.cc 文件，也许会更保险，因为源码文件可能是 C++ 码的。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;SOURCES = $(wildcard *.c *.cc) <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;利用 patsubst ，我们可以由源码文件名产生目标文件名，我们需 要编译出这些目标文件。如果我们的源码文件既有 .c 文件，也有 .cc 文件，我们需要使用相嵌的 patsubst 函数呼叫： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES))) <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;最里面一层 patsubst 的呼叫会对 .cc 文件进行后缀替代，产生的结 果被外层的 patsubst 呼叫处理，进行对 .c 文件后缀的替代。 <br>&nbsp;&nbsp;&nbsp;&nbsp;现在我们可以设立一个规则来建可执行文件： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;myprog : $(OBJS) <br>&nbsp;&nbsp;&nbsp;&nbsp; gcc -o myprog $(OBJS) <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;进一步的规则不一定需要， gcc 已经知道怎么去生成目标文件 (object files) 。下面我们可以设定产生依靠信息的规则： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;depends : $(SOURCES) <br>&nbsp;&nbsp;&nbsp;&nbsp; gcc -M $(SOURCES) &gt; depends <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;在这里如果一个叫 'depends' 的文件不存在，或任何一个源码文件 比一个已存在的 depends 文件新，那么一个 depends 文件会被生 成。depends 文件将会含有由 gcc 产生的关于源码文件的规则（注 意 -M 开关）。现在我们要让 make 把这些规则当做 makefile 档 的一部分。这里使用的技巧很像 C 语言中的 #include 系统——我 们要求 make 把这个文件 include 到 makefile 里，如下： <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;include depends <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;GNU Make 看到这个，检查 'depends' 目的是否更新了，如果没有， 它用我们给它的命令重新产生 depends 档。然后它会把这组（新） 规则包含进来，继续处理最终目标 'myprog' 。当看到有关 myprog 的规则，它会检查所有的目标文件是否更新——利用 depends 文件 里的规则，当然这些规则现在已经是更新过的了。 <br>&nbsp;&nbsp;&nbsp;&nbsp;这个系统其实效率很低，因为每当一个源码文件被改动，所有的源码 文件都要被预处理以产生一个新的 'depends' 文件。而且它也不是 100% 的安全，这是因为当一个 header 档被改动，依靠信息并不会 被更新。但就基本工作来说，它也算相当有用的了。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;2.8 一个更好的 makefile <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;这是一个我为我大多数项目设计的 makefile 。它应该可以不需要修 改的用在大部分项目里。我主要把它用在 djgpp 上，那是一个 DOS 版的 gcc 编译器。因此你可以看到执行的命令名、 'alleg' 程序包、 和 RM -F 变量都反映了这一点。 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;=== makefile 开始 === <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;###################################### <br>&nbsp;&nbsp;&nbsp;&nbsp;# <br>&nbsp;&nbsp;&nbsp;&nbsp;# Generic makefile <br>&nbsp;&nbsp;&nbsp;&nbsp;# <br>&nbsp;&nbsp;&nbsp;&nbsp;# by George Foot <br>&nbsp;&nbsp;&nbsp;&nbsp;# email: george.foot@merton.ox.ac.uk <br>&nbsp;&nbsp;&nbsp;&nbsp;# <br>&nbsp;&nbsp;&nbsp;&nbsp;# Copyright (c) 1997 George Foot <br>&nbsp;&nbsp;&nbsp;&nbsp;# All rights reserved. <br>&nbsp;&nbsp;&nbsp;&nbsp;# 保留所有版权 <br>&nbsp;&nbsp;&nbsp;&nbsp;# <br>&nbsp;&nbsp;&nbsp;&nbsp;# No warranty, no liability; <br>&nbsp;&nbsp;&nbsp;&nbsp;# you use this at your own risk. <br>&nbsp;&nbsp;&nbsp;&nbsp;# 没保险，不负责 <br>&nbsp;&nbsp;&nbsp;&nbsp;# 你要用这个，你自己担风险 <br>&nbsp;&nbsp;&nbsp;&nbsp;# <br>&nbsp;&nbsp;&nbsp;&nbsp;# You are free to modify and <br>&nbsp;&nbsp;&nbsp;&nbsp;# distribute this without giving <br>&nbsp;&nbsp;&nbsp;&nbsp;# credit to the original author. <br>&nbsp;&nbsp;&nbsp;&nbsp;# 你可以随便更改和散发这个文件 <br>&nbsp;&nbsp;&nbsp;&nbsp;# 而不需要给原作者什么荣誉。 <br>&nbsp;&nbsp;&nbsp;&nbsp;# （你好意思？） <br>&nbsp;&nbsp;&nbsp;&nbsp;# <br>&nbsp;&nbsp;&nbsp;&nbsp;###################################### <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;### Customising <br>&nbsp;&nbsp;&nbsp;&nbsp;# 用户设定 <br>&nbsp;&nbsp;&nbsp;&nbsp;# <br>&nbsp;&nbsp;&nbsp;&nbsp;# Adjust the following if necessary; EXECUTABLE is the target <br>&nbsp;&nbsp;&nbsp;&nbsp;# executable's filename, and LIBS is a list of libraries to link in <br>&nbsp;&nbsp;&nbsp;&nbsp;# (e.g. alleg, stdcx, iostr, etc). You can override these on make's <br>&nbsp;&nbsp;&nbsp;&nbsp;# command line of course, if you prefer to do it that way. <br>&nbsp;&nbsp;&nbsp;&nbsp;# <br>&nbsp;&nbsp;&nbsp;&nbsp;# 如果需要，调整下面的东西。 EXECUTABLE 是目标的可执行文件名， LIBS <br>&nbsp;&nbsp;&nbsp;&nbsp;# 是一个需要连接