﻿<?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>BlogJava-VincentChen‘s Blog-文章分类-Linux</title><link>http://www.blogjava.net/Vencent/category/5870.html</link><description>&lt;font color='orange'&gt;本博客仅为收集所用。在此对原作者表示感谢。&lt;/font&gt;
&lt;center&gt;
&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;div class="custom"&gt;
&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6256612161572960";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text";
google_ad_channel ="";
google_page_url = document.location;
google_color_border = ["FFDDAA","FFDDAA","FFDDAA","FFDDAA"];
google_color_bg = ["EEEEEE","EEEEEE","EEEEEE","EEEEEE"];
google_color_link = ["FFDDAA","0033FF","00008B","99CC33"];
google_color_url = ["999999","0033FF","00008B","FFCC00"];
google_color_text = ["0033FF","AA9999","0033FF","AA9999"];
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;/div&gt;&lt;/center&gt;
&lt;!--bgsound src="http://www.blogjava.net/Files/Vencent/The%20Mass%20Era.zip" volume="10" loop="10"/--&gt;
&lt;script type="text/javascript" src="http://shooter.cn/api/shteapi.js" charset='utf-8'&gt;&lt;/script&gt;
&lt;link rel="stylesheet" type="text/css" href="http://shooter.cn/api/standard.css" /&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 26 Jun 2007 16:09:09 GMT</lastBuildDate><pubDate>Tue, 26 Jun 2007 16:09:09 GMT</pubDate><ttl>60</ttl><item><title>Apt-get使用指南</title><link>http://www.blogjava.net/Vencent/articles/126076.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Mon, 25 Jun 2007 04:58:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/126076.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/126076.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/126076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/126076.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/126076.html</trackback:ping><description><![CDATA[【摘要】<br>
<div class="content">
<li>apt-get update——在修改/etc/apt/sources.list或者/etc/apt/preferences之後运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的。 </li>
<li>apt-get install packagename——安装一个新软件包（参见下文的aptitude） </li>
<li>apt-get remove packagename——卸载一个已安装的软件包（保留配置文件） </li>
<li>apt-get --purge remove packagename——卸载一个已安装的软件包（删除配置文件） </li>
<li>dpkg --force-all --purge packagename 有些软件很难卸载，而且还阻止了别的软件的应用，就可以用这个，不过有点冒险。 </li>
<li>apt-get autoclean apt会把已装或已卸的软件都备份在硬盘上，所以如果需要空间的话，可以让这个命令来删除你已经删掉的软件 </li>
<li>apt-get clean 这个命令会把安装的软件的备份也删除，不过这样不会影响软件的使用的。 </li>
<li>apt-get upgrade——更新所有已安装的软件包 </li>
<li>apt-get dist-upgrade——将系统升级到新版本 </li>
<li>apt-cache search string——在软件包列表中搜索字符串 </li>
<li>dpkg -l package-name-pattern——列出所有与模式相匹配的软件包。如果您不知道软件包的全名，您可以使用&#8220;*package-name-pattern*&#8221;。 </li>
<li>aptitude——详细查看已安装或可用的软件包。与apt-get类似，aptitude可以通过命令行方式调用，但仅限于某些命令——最常见的有安装和卸载命令。由于aptitude比apt-get了解更多信息，可以说它更适合用来进行安装和卸载。 </li>
<li>apt-cache showpkg pkgs——显示软件包信息。 </li>
<li>apt-cache dumpavail——打印可用软件包列表。 </li>
<li>apt-cache show pkgs——显示软件包记录，类似于dpkg &#8211;print-avail。 </li>
<li>apt-cache pkgnames——打印软件包列表中所有软件包的名称。 </li>
<li>dpkg -S file——这个文件属于哪个已安装软件包。 </li>
<li>dpkg -L package——列出软件包中的所有文件。 </li>
<li>apt-file
search
filename——查找包含特定文件的软件包（不一定是已安装的），这些文件的文件名中含有指定的字符串。apt-file是一个独立的软件包。您必须
先使用apt-get install来安装它，然後运行apt-file update。如果apt-file search
filename输出的内容太多，您可以尝试使用apt-file search filename | grep -w
filename（只显示指定字符串作为完整的单词出现在其中的那些文件名）或者类似方法，例如：apt-file search filename
| grep
/bin/（只显示位于诸如/bin或/usr/bin这些文件夹中的文件，如果您要查找的是某个特定的执行文件的话，这样做是有帮助的）。</li>
<br>【全文】<br>
<p>原文出处：<a  href="https://help.ubuntu.com/community/AptGetHowto" target="_blank" class="external free exlink" title="https://help.ubuntu.com/community/AptGetHowto" rel="nofollow">https://help.ubuntu.com/community/AptGetHowto</a> </p>
<p>原文作者：UbuntuWiki </p>
<p>授权许可： </p>
<ul>
    <li><a  href="http://creativecommons.org/licenses/by-sa/2.0/" target="_blank" class="external text exlink" title="http://creativecommons.org/licenses/by-sa/2.0/" rel="nofollow">创作共享协议Attribution-ShareAlike 2.0</a> </li>
    <li><a  href="http://www.gnu.org/copyleft/fdl.html" target="_blank" class="external text exlink" title="http://www.gnu.org/copyleft/fdl.html" rel="nofollow">GNU自由文档许可证</a> </li>
</ul>
<p>翻译人员：sigus 5451vs5451 youyou keke initnas </p>
<p>校正人员：MillenniumDark </p>
<p><br>适用版本： </p>
<p>&#8220;起
初GNU/Linux系统中只有.tar.gz。用户必须自己编译他们想使用的每一个程序。在Debian出现之後，人们认为有必要在系统中添加一种机制
用来管理安装在计算机上的软件包。人们将这套系统称为dpkg。至此着名的&#8216;package&#8217;首次在GNU/Linux上出现。不久之後红帽子也开始着手
建立自己的包管理系统&#8216;rpm&#8217;。 </p>
<p>&#8220;GNU/Linux的创造者们很快又陷入了新的窘境。他们希望通过一种快捷、实用而且高效的方式来
安装软件包。这些软件包可以自动处理相互之间的依赖关系，并且在升级过程中维护他们的配置文件。Debian又一次充当了开路先锋的角色。她首创了APT
（Advanced Packaging Tool）。这一工具後来被<em>Conectiva</em>移植到红帽子系统中用于对rpm包的管理。在其他一些发行版中我们也能看到她的身影。&#8221; </p>
<ul>
    <li>-- 摘自 Debian APT HOWTO </li>
</ul>
<p>"同时，apt是一个很完整和先进的软件包管理程序，使用它可以让你，又简单，又准确的找到你要的的软件包， 并且安装或卸载都很简洁。 它还可以让你的所有软件都更新到最新状态，而且也可以用来对ubuntu进行升级。" </p>
<p>"apt是需要用命令来操作的软件，不过现在也出现了很多有图形的软件，比如Synaptic, Kynaptic 和 Adept。" </p>
<p>下面将要介绍的所有命令都需要sudo！使用时请将&#8220;packagename&#8221;和&#8220;string&#8221;替换成您想要安装或者查找的程序。 </p>
<ul>
    <li>apt-get update——在修改/etc/apt/sources.list或者/etc/apt/preferences之後运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的。 </li>
    <li>apt-get install packagename——安装一个新软件包（参见下文的aptitude） </li>
    <li>apt-get remove packagename——卸载一个已安装的软件包（保留配置文件） </li>
    <li>apt-get --purge remove packagename——卸载一个已安装的软件包（删除配置文件） </li>
    <li>dpkg --force-all --purge packagename 有些软件很难卸载，而且还阻止了别的软件的应用，就可以用这个，不过有点冒险。 </li>
    <li>apt-get autoclean apt会把已装或已卸的软件都备份在硬盘上，所以如果需要空间的话，可以让这个命令来删除你已经删掉的软件 </li>
    <li>apt-get clean 这个命令会把安装的软件的备份也删除，不过这样不会影响软件的使用的。 </li>
    <li>apt-get upgrade——更新所有已安装的软件包 </li>
    <li>apt-get dist-upgrade——将系统升级到新版本 </li>
    <li>apt-cache search string——在软件包列表中搜索字符串 </li>
    <li>dpkg -l package-name-pattern——列出所有与模式相匹配的软件包。如果您不知道软件包的全名，您可以使用&#8220;*package-name-pattern*&#8221;。 </li>
    <li>aptitude——详细查看已安装或可用的软件包。与apt-get类似，aptitude可以通过命令行方式调用，但仅限于某些命令——最常见的有安装和卸载命令。由于aptitude比apt-get了解更多信息，可以说它更适合用来进行安装和卸载。 </li>
    <li>apt-cache showpkg pkgs——显示软件包信息。 </li>
    <li>apt-cache dumpavail——打印可用软件包列表。 </li>
    <li>apt-cache show pkgs——显示软件包记录，类似于dpkg &#8211;print-avail。 </li>
    <li>apt-cache pkgnames——打印软件包列表中所有软件包的名称。 </li>
    <li>dpkg -S file——这个文件属于哪个已安装软件包。 </li>
    <li>dpkg -L package——列出软件包中的所有文件。 </li>
    <li>apt-file
    search
    filename——查找包含特定文件的软件包（不一定是已安装的），这些文件的文件名中含有指定的字符串。apt-file是一个独立的软件包。您必须
    先使用apt-get install来安装它，然後运行apt-file update。如果apt-file search
    filename输出的内容太多，您可以尝试使用apt-file search filename | grep -w
    filename（只显示指定字符串作为完整的单词出现在其中的那些文件名）或者类似方法，例如：apt-file search filename
    | grep
    /bin/（只显示位于诸如/bin或/usr/bin这些文件夹中的文件，如果您要查找的是某个特定的执行文件的话，这样做是有帮助的）。 </li>
</ul>
<p>＊
apt-get
autoclean——定期运行这个命令来清除那些已经卸载的软件包的.deb文件。通过这种方式，您可以释放大量的磁盘空间。如果您的需求十分迫切，可
以使用apt-get
clean以释放更多空间。这个命令会将已安装软件包裹的.deb文件一并删除。大多数情况下您不会再用到这些.debs文件，因此如果您为磁盘空间不足
而感到焦头烂额，这个办法也许值得一试。 </p>
<p>您可以通过定义别名（alias）来提高这些命令的输入速度。例如，您可以在您的*~/.bashrc*文件中添加下列内容 </p>
<pre>alias acs='apt-cache search'<br>alias agu='sudo apt-get update'<br>alias agg='sudo apt-get upgrade'<br>alias agd='sudo apt-get dist-upgrade'<br>alias agi='sudo apt-get install'<br>alias agr='sudo apt-get remove'</pre>
<p>或者使用前面介绍的aptitude命令，如&#8220;alias agi='sudo aptitude install'&#8221;。 </p>
</div><img src ="http://www.blogjava.net/Vencent/aggbug/126076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2007-06-25 12:58 <a href="http://www.blogjava.net/Vencent/articles/126076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xmms和bmp里的重要插件</title><link>http://www.blogjava.net/Vencent/articles/32040.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Wed, 22 Feb 2006 16:48:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32040.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32040.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32040.html</trackback:ping><description><![CDATA[作者：Wwashington AT smth bbs<br><br>前言：欢迎转载，但是您必须保留原文的所有信息，包括作者和时间。<br><br>一、其实今天写了两篇文章，刚才那篇内容是 OpenBSD 的安装脚本和<br>FreeBSD 的实用脚本，现在再贴一篇关于 xmms 和 bmp 的重要插件，<br>当然了，依然是针对 FreeBSD 和 OpenBSD 的，它们比 Linux 难用。<br>还是按以往惯例发在 NewSoftware 区，因为它们都是讨论应用问题。<br><br>长期以来，因为 Unix 一般用于服务器而不是桌面系统，导致可视化和<br>多媒体方面明显落后于 Windows，从而严重降低了对普通用户的吸引力。<br>现在 xorg 比 XF86 改进了很多，我们只要再把音乐、DVD 搞定，基本<br>上就是一台 Unix 下的多媒体 PC 了，这对于推动 Unix 在群众中普及<br>有一定的积极作用。听音乐可以用 xmms 和 bmp (beep-media-player)，<br>看 DVD 主要用 xine。<br><br>编译 xine 不难，只要到 FreeBSD 的 ports 里去编译就可以了。此外<br>编译 xmms 以及显示汉字也不难，可以参考 FreeBSD简单汉化终结篇。<br>到 Google 搜一下有很多，但要注意 zh_CN.EUC 应该是 zh_CN.eucCN，<br>否则你在这个语言环境下编译 xmms 会报告说缺乏 glib 库支持。<br><br>二、我要讨论的是，在 OpenBSD 里的 libsun 以及 FreeBSD 里的 oss<br>和 esound 是不健全的，它们在 KDE 环境下有时候无法发出声音。通过<br>查找资料，我发现应该使用 arts 的 Output，因为 KDE 的声音管理器<br>就是 arts。同时，除了众所周知的 mp3 之外，wma 格式也很流行，我<br>找到了 wma 的 Input 解码插件并使用成功。<br><br>三、下面列出下载这些 plugin 的地方，大家也可以根据文件名来搜索。<br><br>http://www.xmms.org/plugins.php?category=output<br><br>http://www.xmms.org/plugins.php?details=22<br>http://www.freshports.org/audio/xmms-arts/<br>http://www.freebsdsoftware.org/audio/xmms-arts.html<br><br>http://www.xmms.org/plugins.php?details=85<br>http://www.freshports.org/audio/xmms-arts_output/<br>http://www.freebsdsoftware.org/audio/xmms-arts_output.html<br><br>http://havardk.xmms.org/plugins/arts_output/<br>http://havardk.xmms.org/plugins/arts_output/arts_output-0.7.1.tar.gz<br><br>http://archives.neohapsis.com/archives/openbsd/2004-10/0686.html<br>http://www.monkey.org/openbsd/archive/ports/0410/msg00589.html<br>arts_output.tar.gz (OpenBSD patch)<br><br>http://www.gentoo-portage.com/media-plugins/bmp-arts<br>http://www.sosdg.org/~larne/w/Plugin_list<br>http://linuv.uv.es/mirror/gentoo/distfiles/<br>http://linuv.uv.es/mirror/gentoo/distfiles/bmp-arts-plugin-0.7.2.tar.gz<br><br>http://www.ubuntu.org.cn/support/documentation/wiki/BeepMediaPlayer<br>BMP 是一个使用GTK2的看起来更好的XMMS的分支。WMA插件下载与安装。<br>http://download.berlios.de/bmp-plugins/bmp-wma-0.1.1.tar.gz<br><br>http://mcmcc.bat.ru/xmms-wma/<br>http://mcmcc.bat.ru/xmms-wma/xmms-wma-1.0.5.tar.bz2<br>v.1.0.5 - Added opportunity to build plug-in for player BMP.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Fix bug with blanks with use gnome-vfs in BMP.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - WARNING: BEEPMP-WMA conflict with BMP-WMA. Remove BMP-WMA or<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do not use BEEPMP-WMA.<br><br>四、下面列出编译的方法，由于时间关系我就不详细讲解了。请大家按<br>步骤操作，否则，编译时可能会提示你：缺乏需要的库文件。<br><br>/usr/bin/ld: cannot find -lffwma&nbsp; {直接编译 xmms-wma 时的错误}<br>--------------------------------------------------------------<br><br>cd /usr/ports/devel/libtool13<br>make install clean<br>cd /usr/ports/devel/libtool15<br>make install clean<br>cd /usr/local/bin<br>ln -s libtool15 libtool<br><br>cd /usr/ports/chinese/xmms<br>make install clean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {编译完最好在 XWin 运行一下}<br>cd /usr/ports/multimedia/beep-media-player<br>make install clean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {编译完最好在 XWin 运行一下}<br><br>cd /usr/ports/distfiles/Output<br><br>gzip -dc bmp-wma-0.1.1.tar.gz | tar -xvf -<br>cd bmp-wma-0.1.1<br>./configure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {如果没安装bmp,配置时会报错}<br>make install<br>ls -la src/libffwma/*.a<br>cp -pf src/libffwma/*.a /usr/local/lib<br>ls -la /usr/local/lib/libff*&nbsp;&nbsp; # { Make sure libffwma.a is okay }<br>cd ..<br><br>bzip2 -dc xmms-wma-1.0.5.tar.bz2 | tar -xvf -<br>cd xmms-wma-1.0.5<br>vi xmms-wma.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # { Replace malloc.h to stdlib.h }<br>vi ffmpeg-strip-wma/mem.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # { Replace malloc.h to stdlib.h }<br>gmake install-home<br>cd ..<br><br>gzip -dc arts_output-0.7.1.tar.gz | tar -xvf -<br>cd arts_output-0.7.1<br>./configure<br>make install<br>cd ..<br><br>gzip -dc bmp-arts-plugin-0.7.2.tar.gz | tar -xvf -<br>cd bmp-arts-plugin-0.7.2<br>mkdir =build<br>cd =build<br>../configure<br>make install<br>cd ../..<br><br>五、注意：在 OpenBSD 下有个补丁要打，否则的话 arts 插件无法使用。<br>此外 xmms 和 bmp 可以兼容 Winamp 大多数 Skins，放到相应目录就行。<br><br>附件: <a HREF="/Files/Vencent/arts_output_obsd.tar.gz.rar">arts_output_obsd.tar.gz</a> (1713 Bytes) <br><img src ="http://www.blogjava.net/Vencent/aggbug/32040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-02-23 00:48 <a href="http://www.blogjava.net/Vencent/articles/32040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenBSD的定制安装脚本</title><link>http://www.blogjava.net/Vencent/articles/32039.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Wed, 22 Feb 2006 16:39:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32039.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32039.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32039.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32039.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32039.html</trackback:ping><description><![CDATA[作者：Wwashington AT smth bbs<br><br>前言：欢迎转载，但是您必须保留原文的所有信息，包括作者和时间。<br><br>一、其实几年前我就用过 OpenBSD 3.3了，当时觉得界面确实很粗糙。<br>正因为花哨的东西少了，所以开发出来的系统缺陷相对少一些。所谓<br>做多错多，做少错少，我觉得 OpenBSD 体现了简约美，而 FreeBSD<br>则比较适合那些喜欢装好系统就用的人。当时考虑到 OpenBSD 上还要<br>自己去编译 KDE、Gnome 之类的窗口管理器太麻烦，所以用的不多。<br><br>二、ChinaUnix 论坛上提供了 MichaelBibby 朋友所制作的 OpenBSD<br>3.8 版 ISO 文件。我装过后发现缺少 packages 的安装说明，手工<br>安装比较辛苦，而且该版的 KDE 3.4.2 桌面三个图标点击后无法正确<br>运行, 这三个默认的图标分别链接到 trash:/ , system:/ , /root。<br><br>此外该版对 xmms 的汉化支持不好，按照 FreeBSD 简单汉化终结篇<br>的方法可以完成 FreeBSD 系统以及 xmms 的汉化，但是 zh_Cn.eucCN<br>语言和 -sony-...-gbk-0 字体对 OpenBSD 不起作用。除了各种小毛<br>病外，总体来说这个 ISO 还是比较全的，包含很多编译好的软件包。<br>如果大家想装好就用，装一下这个 ISO 并不断完善是很好的办法。<br><br>http://bbs.chinaunix.net/viewthread.php?tid=691951&amp;extra=&amp;page=1<br>[下载]MichaelBibby 朋友的 OpenBSD 3.8<br><br>三、后来我自己写了个安装脚本，大大提高了安装的便利性。不过我<br>发现里面有两个以 redhat 开头的软件包会干扰系统正常运行，它们<br>是 Linux 仿真包，或许应该装到别的目录下，为了省事我的安装脚本<br>干脆就跳过它们了。下面简单介绍一下安装步骤以及基本原理，将来<br>任何人自己定制了更好的 ISO 版后，都可以利用这个安装脚本。<br><br>四、安装步骤：<br><br>a) 首先，你要下载附件里的 init.tar.gz，最好是把本机的 C 盘做<br>成 150M 左右的 FAT16 分区，Windows系统放 D 盘，那么 C 盘就单<br>纯做启动盘并跟 Unix 交换数据了。如果不这样，将来必须另找机器<br>把 init.tar.gz 用 ftp 或 ssh 传到你需要使用的 OpenBSD 机器上。<br><br>多系统共存的文章请大家上网去搜索，我以前写过 OS Loader 的用法。<br>我把 init 压缩包解压后放到 C:\Boot\Unix\init 目录里，所以后面<br><br>b) 解压后大家可以看到 init 目录下有 csh 和 ksh 两个目录，其中<br>ksh 是针对 OpenBSD 默认 Shell，csh 则针对 FreeBSD 默认 Shell。<br><br>这里顺带说一下，FreeBSD 4.x 的 SSHD 不能设置禁止 DNS，所以一<br>旦机器不能访问外网的 DNS 服务器，那么任何机器都不能用 SSH 来<br>登陆这台机器，所以我在 csh 目录下的 alias 里设置了 exit 为自<br>动关闭 DNS，这样默认就不使用 DNS 了，需要的时候再开。大家运行<br>al 就可以看到所有的 alias 了。其中以 dn 开头的那些是修改 dns<br>开或关的，以 zh 开头的那些是准备汉化时调整系统语言类型的。<br><br>装 csh 包需要把这个目录下的文件都拷贝到 $HOME，然后再改名如下：<br>cat login.csh &gt; .login<br>cat cshrc.csh &gt;&gt; .cshrc<br>cp /usr/bin/make /usr/bin/bmake&nbsp;&nbsp;&nbsp; {这是为了将来可以切换make}<br><br>下面列出允许和关闭 DNS 的 alias 定义，贴出来与大家共同研究。<br><br>alias exit 'dndis; logout'<br>alias dncat 'cd /etc; cat resolv.conf'<br>alias dndis 'cd /etc; mv resolv.conf resolv.temp; cat resolv.temp | sed<br>"s/^nameserver/#nameserver/g" &gt; resolv.conf; rm resolv.temp'<br>alias dnena 'cd /etc; mv resolv.conf resolv.temp; cat resolv.temp | sed<br>"s/^#nameserver/nameserver/g" &gt; resolv.conf; rm resolv.temp'<br><br>c) 现在回到正题，安装 OpenBSD 的 ksh 包也是把文件拷贝到 $HOME。<br>alias.ksh 是系统别名 alias 的集合，cat profile.ksh &gt; .profile<br>则可以让你登陆系统后立刻加载 alias.ksh，sk-38.ini 是需要跳过的<br>安装名单。前面说了，如果不跳过这两包，可能导致系统无法使用。<br><br>当 OpenBSD 的 alias.ksh 加载后，你就可以使用它来安装 ChinaUnix<br>上的 ISO 所提供的那些 packages 了。安装完毕后你可以设置 CU_CDR<br>为 0，这样系统用的 alias 就会大大减少。<br><br>首先启动 OpenBSD，插入安装盘，输入 mcd，它会 mount 你的安装盘<br>到 /mnt 目录，然后输入 culist 看有哪些包可以装，它会显示以下的<br>选项：cupack, cukde3, cufc4, cuacr7, cuacf7, 你可以按需要安装。<br>装完后输入 ucd，它会 umount 光盘，然后把盘取出就算完成了。使用<br>KDE 的时候编辑 ~/.xinitrc，内容写 startkde 就可以了。<br><br>五、基本原理：<br><br>a) 大家用 al | grep cu 就可以看到所有跟安装有关的 alias 用法。<br>其中 cubase 是我最早使用的 cuinst，后来发现 3.8 ISO 里有两个<br>包影响系统使用，逐步扩充为以 cubase 为基础，cushow 查看出错的<br>原因，cubash 研究 if 在 alias 里的用法，cutest 为测试安装，而<br>cuskip 则是正式安装，使用 $HOME/sk-38.ini。如果用户想自己动手<br>查看以上脚本的结果，只要把 cuinst 改为对应的功能块就可以了。<br><br>b) 核心原理是通过定义系统变量 CUPACK，然后用脚本进行批量解压。<br>里面主要是用到了 for 的技巧，以及用 grep 查找忽略列表，用 if<br>来判断结果。需要注意的是它们在 ksh 下测试通过，如果你换到别的<br>Shell 下用，必须根据具体语法特点进行修改。<br><br>&nbsp;alias cubase='for i in /mnt/3.8/i386$CUPACK; do gzip -dc $i | tar -xvf -; done'<br>&nbsp;alias cubash='for i in /mnt/3.8/i386$CUPACK; do echo $i; if [ "`gzip -dc $i |<br>tar -tvf - | grep bash`" != "" ]; then echo *{_bash_}; sleep 5; fi; done'<br>&nbsp;alias cushow='for i in /mnt/3.8/i386$CUPACK; do echo $i; gzip -dc $i | tar<br>-tvf - | grep bash; done'<br><br>&nbsp;alias cuskip='for i in /mnt/3.8/i386$CUPACK; do echo $i; if [ "`grep $i<br>$HOME/sk-38.ini`" = "" ]; then gzip -dc $i | tar -xvf - &gt; /dev/null; else echo<br>*{_skip_}; sleep 5; fi; done'<br>&nbsp;alias cutest='for i in /mnt/3.8/i386$CUPACK; do echo $i; if [ "`grep $i<br>$HOME/sk-38.ini`" = "" ]; then gzip -dc $i | tar -tvf - &gt; /dev/null; else echo<br>*{_skip_}; sleep 5; fi; done'<br>&nbsp;alias cuinst='cuskip'<br>&nbsp;alias culist='alias | grep cuinst'<br><br>&nbsp;alias cupack='export CUPACK=/packages/*gz; cd /usr/local; cuinst'<br>&nbsp;alias cukde3='export CUPACK=/packages/kde-3.4.3/*gz; cd /usr/local; cuinst'<br><br>c) 从上面的清单可以看出，cupack 和 cukde3 都是建立在 cuinst 的<br>基础上的，先定义好 CUPACK 的值再调用安装脚本。cuinst 是指定使用<br>哪一个脚本。culist 是显示所有可用安装包以及当前的 cuinst 类型。<br><br>上面的脚本里，cubase 是单纯的解压，不考虑任何意外情况。cushow里<br>显示在什么地方装了 bash，因为按照 cubase 的做法最后 bash 是不能<br>用的。cubash 利用 if 精简了显示，让我们找到有问题的软件包，其实<br>就是以 redhat 开头的包。没时间研究如何使用，直接忽略算了。<br><br>我们把要忽略的包写到 sk-38.ini，然后放到 $HOME 目录下，这样将来<br>就可以随时定制安装哪些软件包了。cuskip 和 cutest 本质上是一样的，<br>不同的是 cutest 用了 tar -tvf - 来显示文件清单，而不是真正解压。<br>最后，希望大家如果做出了更好的 OpenBSD ISO，请使用这个安装脚本，<br>如果改进了上面的安装脚本或者有更好的方案，请发一份给我，谢谢。<br><br>附件：<a HREF="/Files/Vencent/init.tar.gz.rar">init.tar.gz.rar</a> <br><img src ="http://www.blogjava.net/Vencent/aggbug/32039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-02-23 00:39 <a href="http://www.blogjava.net/Vencent/articles/32039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在mingw环境下编译mplayer-1.0pre1的步骤</title><link>http://www.blogjava.net/Vencent/articles/23390.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Sun, 11 Dec 2005 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/23390.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/23390.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/23390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/23390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/23390.html</trackback:ping><description><![CDATA[mplayer-1.0pre1支持在mingw环境下运行，参照了mplayer文档，列出安装步骤：
1 http://sourceforge.net/projects/mingw/
FILES栏中current中下载mingw-2.0.0.3.exe和msys-1.0.9.exe并解开安装，在安装完msys之后，按照提示输入mingw所在的路径。
2 下载http://www.mplayerhq.hu/MPlayer/releases/win32-beta/contrib/types.h
放在mingw安装目录的/include/sys下
3 下载http://www.videolan.org/vlc/dx7headers.tgz
解压放入mingw安装目录的/include下
4 下载mplayer-1.0pre1源代码。启动msys.bat，在shell下配置并编译。配置时没有附加选项。
5 如果在编译libfdda的库时碰到错误，在libfaad2/common.h的35行后插入
#undef _WIN32
6 编译通过后，make install时，安装man时会出错，不要管它。
之后可以直接通过shell启动mplayer。
在p41.4,win2000下，播放效果很好，cpu占用率在40%到50%之间，占用内存8M。比起其他的播放器，cpu占用率高10%多，而内存小一半以上。
第5步是个人试验的结果，仅供参考。 

mplayer-cygwin九月份的maillist archive上，第一篇文章
那篇文章的作者说，成功在mingw上将osd menu,freetype,还有dvd支持都编译进去了，最后，用upx压了一下，mplayer.exe只有1M多
而且不带其他的东西了
他说过些时候把改动过的patch放出来(现在只有一个runtime-cpu-detection的版本可以下载) 
谢谢楼上的提醒,个人觉得还是定制会符合自己的需要.这也是mplayer作者推荐的做法.
需要exe的,可以到
http://www.mplayerhq.hu/MPlayer/releases/win32-beta/
去下.
因为路径的问题,我没能够支持fonts,就是说不能显示字幕.但播放divx/xvid的文件良好,表现让人满意, 

误解了，我也是想等他把patch都放出来，自己编译啊
runtime-cpu-detection总归不爽

我自己前两天也编译了一个版本
能播放rm和mov,能显示字幕(用mingw编译的时候，老是遇到一个fread的错误的返回值，导致vobsub格式的字幕读不出来,所以这个版本是在cygwin下编译的)
不过，由于带了很多codec,还有cygwin的dll，压缩后大概还有8M的样子. -.-!


cygwin的环境实在是不稳定，推荐使用mingw。
编译下来，因为mingw不完全支持posix，所以不支持osd menu。
此外，我不知道如何在mingw下支持gtk+的开发，所以没法编译gui。
推荐各位在windows下使用mplayer，我已经这么做了。
耗资源和内存都很小，可以说是很高效的播放器 <img src ="http://www.blogjava.net/Vencent/aggbug/23390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2005-12-11 22:09 <a href="http://www.blogjava.net/Vencent/articles/23390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux平台Makefile文件的编写基础篇 (转载)</title><link>http://www.blogjava.net/Vencent/articles/23309.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Sat, 10 Dec 2005 18:44:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/23309.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/23309.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/23309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/23309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/23309.html</trackback:ping><description><![CDATA[<P><B><SPAN>目的：<BR></SPAN></B><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>基本掌握了</SPAN><SPAN lang=EN-US> make </SPAN><SPAN>的用法，能在</SPAN><SPAN lang=EN-US>Linux</SPAN><SPAN>系统上编程。<BR></SPAN><B><SPAN>环境：<BR></SPAN></B><B><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></B><SPAN lang=EN-US>Linux</SPAN><SPAN>系统，或者有一台</SPAN><SPAN lang=EN-US>Linux</SPAN><SPAN>服务器，通过终端连接。一句话：有</SPAN><SPAN lang=EN-US>Linux</SPAN><SPAN>编译环境。<BR></SPAN><B><SPAN>准备：<BR></SPAN></B><B><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></B><SPAN>准备三个文件：</SPAN><SPAN lang=EN-US>file1.c, file2.c, file2.h<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><B>file1.c:<BR></B></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>#include &lt;stdio.h&gt;<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>#include "file2.h"<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>int main()<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n");<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>File2Print();<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return 0;<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><B>file2.h:</B></SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>#ifndef FILE2_H_<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>#define<SPAN>&nbsp;&nbsp;&nbsp; </SPAN>FILE2_H_</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>#ifdef __cplusplus</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>extern "C" {</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>#endif</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>void File2Print();</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>#ifdef __cplusplus</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>#endif</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>#endif</SPAN></P>
<P><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><B>file2.c:<BR></B></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>#include "file2.h"<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>void File2Print()<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf("Print file2**********************\n");<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P><B><SPAN>基础：<BR></SPAN></B><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>先来个例子：<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>有这么个</SPAN><SPAN lang=EN-US>Makefile</SPAN><SPAN>文件。（文件和</SPAN><SPAN lang=EN-US>Makefile</SPAN><SPAN>在同一目录）<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>=== makefile </SPAN><SPAN>开始</SPAN><SPAN lang=EN-US> ===<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>helloworld:file1.o file2.o<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>gcc file1.o file2.o -o helloworld<BR></SPAN><SPAN lang=EN-US><SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>file1.o:file1.c file2.h<BR></SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>gcc -c file1.c -o file1.o</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>file2.o:file2.c file2.h</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>gcc -c file2.c -o file2.o</SPAN></P>
<P><SPAN lang=EN-US></SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>clean:</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>rm -rf *.o helloworld</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>=== makefile </SPAN><SPAN>结束</SPAN><SPAN lang=EN-US> ===</SPAN></P>
<P><SPAN>一个</SPAN><SPAN lang=EN-US> makefile </SPAN><SPAN>主要含有一系列的规则，如下：</SPAN><SPAN lang=EN-US><BR>A: B<BR>(tab)&lt;command&gt;<BR>(tab)&lt;command&gt;</SPAN></P>
<P><SPAN>每个命令行前都必须有</SPAN><SPAN lang=EN-US>tab</SPAN><SPAN>符号。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN>上面的</SPAN><SPAN lang=EN-US>makefile</SPAN><SPAN>文件目的就是要编译一个</SPAN><SPAN lang=EN-US>helloworld</SPAN><SPAN>的可执行文件。让我们一句一句来解释：</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>helloworld : file1.o file2.o</SPAN><SPAN>：</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>helloworld</SPAN><SPAN>依赖</SPAN><SPAN lang=EN-US>file1.o file2.o</SPAN><SPAN>两个目标文件。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>gcc File1.o File2.o -o helloworld</SPAN><SPAN>：</SPAN> <SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>编译出</SPAN><SPAN lang=EN-US>helloworld</SPAN><SPAN>可执行文件。</SPAN><SPAN lang=EN-US>-o</SPAN><SPAN>表示你指定</SPAN> <SPAN>的目标文件名。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>file1.o : file1.c</SPAN><SPAN>：</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>file1.o</SPAN><SPAN>依赖</SPAN><SPAN lang=EN-US>file1.c</SPAN><SPAN>文件。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>gcc -c file1.c -o file1.o</SPAN><SPAN>：</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>编译出</SPAN><SPAN lang=EN-US>file1.o</SPAN><SPAN>文件。</SPAN><SPAN lang=EN-US>-c</SPAN><SPAN>表示</SPAN><SPAN lang=EN-US>gcc </SPAN><SPAN>只把给它的文件编译成目标文件，</SPAN> <SPAN>用源码文件的文件名命名但把其后缀由</SPAN><SPAN lang=EN-US>“.c”</SPAN><SPAN>或</SPAN><SPAN lang=EN-US>“.cc”</SPAN><SPAN>变成</SPAN><SPAN lang=EN-US>“.o”</SPAN><SPAN>。在这句中，可以省略</SPAN><SPAN lang=EN-US>-o file1.o</SPAN><SPAN>，编译器默认生成</SPAN><SPAN lang=EN-US>file1.o</SPAN><SPAN>文件，这就是</SPAN><SPAN lang=EN-US>-c</SPAN><SPAN>的作用。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>file2.o : file2.c file2.h<BR>&nbsp;<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>gcc -c file2.c -o file2.o</SPAN></P>
<P><SPAN>这两句和上两句相同。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>clean:</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>rm -rf *.o helloworld</SPAN></P>
<P><SPAN>当用户键入</SPAN><SPAN lang=EN-US>make clean</SPAN><SPAN>命令时，会删除</SPAN><SPAN lang=EN-US>*.o </SPAN><SPAN>和</SPAN><SPAN lang=EN-US>helloworld</SPAN><SPAN>文件。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN>如果要编译</SPAN><SPAN lang=EN-US>cpp</SPAN><SPAN>文件，只要把</SPAN><SPAN lang=EN-US>gcc</SPAN><SPAN>改成</SPAN><SPAN lang=EN-US>g++</SPAN><SPAN>就行了。</SPAN></P>
<P><SPAN>写好</SPAN><SPAN lang=EN-US>Makefile</SPAN><SPAN>文件，在命令行中直接键入</SPAN><SPAN lang=EN-US>make</SPAN><SPAN>命令，就会执行</SPAN><SPAN lang=EN-US>Makefile</SPAN><SPAN>中的内容了。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN>到这步我想你能编一个</SPAN><SPAN lang=EN-US>Helloworld</SPAN><SPAN>程序了。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><B><SPAN>上一层楼：使用变量</SPAN></B></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>上面提到一句，如果要编译</SPAN><SPAN lang=EN-US>cpp</SPAN><SPAN>文件，只要把</SPAN><SPAN lang=EN-US>gcc</SPAN><SPAN>改成</SPAN><SPAN lang=EN-US>g++</SPAN><SPAN>就行了。但如果</SPAN><SPAN lang=EN-US>Makefile</SPAN><SPAN>中有很多</SPAN><SPAN lang=EN-US>gcc</SPAN><SPAN>，那不就很麻烦了。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>第二个例子：</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>=== makefile </SPAN><SPAN>开始</SPAN><SPAN lang=EN-US> ===<BR><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>OBJS = file1.o file2.o<BR><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>CC = gcc<BR><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>CFLAGS = -Wall -O -g<BR><BR><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>helloworld : $(OBJS)<BR>&nbsp;&nbsp;<SPAN>&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>$(CC) $(OBJS) -o helloworld<BR><BR><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>file1.o : file1.c file2.h<BR>&nbsp;&nbsp;<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>$(CC) $(CFLAGS) -c file1.c -o file1.o<BR><BR><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>file2.o : file2.c file2.h<BR>&nbsp;&nbsp;<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>$(CC) $(CFLAGS) -c file2.c -o file2.o</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>clean:</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>rm -rf *.o helloworld<BR>=== makefile </SPAN><SPAN>结束</SPAN><SPAN lang=EN-US> ===</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>这里我们应用到了变量。要设定一个变量，你只要在一行的开始写下这个变量的名字，后</SPAN> <SPAN>面跟一个</SPAN><SPAN lang=EN-US> = </SPAN><SPAN>号，后面跟你要设定的这个变量的值。以后你要引用</SPAN> <SPAN>这个变量，写一个</SPAN><SPAN lang=EN-US> $ </SPAN><SPAN>符号，后面是围在括号里的变量名。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN lang=EN-US>CFLAGS = -Wall -O –g</SPAN><SPAN>，解释一下。这是配置编译器设置，并把它赋值给</SPAN><SPAN lang=EN-US>CFFLAGS</SPAN><SPAN>变量。</SPAN></P>
<P><SPAN lang=EN-US>-Wall</SPAN><SPAN>：</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>输出所有的警告信息。</SPAN></P>
<P><SPAN lang=EN-US>-O</SPAN><SPAN>：</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>在编译时进行优化。</SPAN></P>
<P><SPAN lang=EN-US>-g</SPAN><SPAN>：</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>表示编译</SPAN><SPAN lang=EN-US>debug</SPAN><SPAN>版本。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>这样写的</SPAN><SPAN lang=EN-US>Makefile</SPAN><SPAN>文件比较简单，但很容易就会发现缺点，那就是要列出所有的</SPAN><SPAN lang=EN-US>c</SPAN><SPAN>文件。如果你添加一个</SPAN><SPAN lang=EN-US>c</SPAN><SPAN>文件，那就需要修改</SPAN><SPAN lang=EN-US>Makefile</SPAN><SPAN>文件，这在项目开发中还是比较麻烦的。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><B><SPAN>再上一层楼：使用函数</SPAN></B></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>学到这里，你也许会说，这就好像编程序吗？有变量，也有函数。其实这就是编程序，只不过用的语言不同而已。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>第三个例子：</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>=== makefile </SPAN><SPAN>开始</SPAN><SPAN lang=EN-US> ===<BR><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>CC = gcc</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>XX = g++<BR><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>CFLAGS = -Wall -O –g</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>TARGET = ./helloworld</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>%.o: %.c</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>$(CC) $(CFLAGS) -c $&lt; -o $@</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>%.o:%.cpp</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>$(XX) $(CFLAGS) -c $&lt; -o $@</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SOURCES = $(wildcard *.c *.cpp)<BR><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))</SPAN></P>
<P><SPAN lang=EN-US><BR><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>$(TARGET) : $(OBJS)<BR>&nbsp;&nbsp;<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>$(XX) $(OBJS) -o $(TARGET)</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>chmod a+x $(TARGET)</SPAN></P>
<P><SPAN lang=EN-US>clean:</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>rm -rf *.o helloworld<BR>=== makefile </SPAN><SPAN>结束</SPAN><SPAN lang=EN-US> ===</SPAN></P>
<P><SPAN>函数</SPAN><SPAN lang=EN-US>1</SPAN><SPAN>：</SPAN><SPAN lang=EN-US>wildcard</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>产生一个所有以</SPAN><SPAN lang=EN-US> '.c' </SPAN><SPAN>结尾的文件的列表。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SOURCES = $(wildcard *.c *.cpp)</SPAN><SPAN>表示产生一个所有以</SPAN><SPAN lang=EN-US> .c</SPAN><SPAN>，</SPAN><SPAN lang=EN-US>.cpp</SPAN><SPAN>结尾的文件的列表，然后存入变量</SPAN><SPAN lang=EN-US> SOURCES </SPAN><SPAN>里。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN>函数</SPAN><SPAN lang=EN-US>2</SPAN><SPAN>：</SPAN><SPAN lang=EN-US>patsubst</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>匹配替换，有三个参数。第一个是一个需要匹配的式样，第二个表示用什么来替换它，第三个是一个需要被处理的由空格分隔的列表。</SPAN></P>
<P><SPAN lang=EN-US>OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))</SPAN><SPAN>表示把文件列表中所有的</SPAN><SPAN lang=EN-US>.c,.cpp</SPAN><SPAN>字符变成</SPAN><SPAN lang=EN-US>.o</SPAN><SPAN>，形成一个新的文件列表，然后存入</SPAN><SPAN lang=EN-US>OBJS</SPAN><SPAN>变量中。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN lang=EN-US>%.o: %.c</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>$(CC) $(CFLAGS) -c $&lt; -o $@</SPAN></P>
<P><SPAN lang=EN-US>%.o:%.cpp</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>$(XX) $(CFLAGS) -c $&lt; -o $@</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>这几句命令表示把所有的</SPAN><SPAN lang=EN-US>.c,.cpp</SPAN><SPAN>编译成</SPAN><SPAN lang=EN-US>.o</SPAN><SPAN>文件。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>这里有三个比较有用的内部变量。</SPAN><SPAN lang=EN-US>$@ </SPAN><SPAN>扩展成当前规则的目的文件名，</SPAN><SPAN lang=EN-US> $&lt; </SPAN><SPAN>扩展成依靠</SPAN><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>列表中的第一个依靠文件，而</SPAN><SPAN lang=EN-US> $^ </SPAN><SPAN>扩展成整个依靠的列表（除掉了里面所有重</SPAN> <SPAN>复的文件名）。</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>chmod a+x $(TARGET)</SPAN><SPAN>表示把</SPAN><SPAN lang=EN-US>helloworld</SPAN><SPAN>强制变成可执行文件。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>到这里，我想你已经能够编写一个比较简单也比较通用的</SPAN><SPAN lang=EN-US>Makefile</SPAN><SPAN>文件了，上面所有的例子都假定所有的文件都在同一个目录下，不包括子目录。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>那么文件不在一个目录可以吗？</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>怎么编写</SPAN><SPAN lang=EN-US>Makefile</SPAN><SPAN>生成静态库？</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>你还想更上一层楼吗？</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>请听下回分解。</SPAN></SPAN></P></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><img src ="http://www.blogjava.net/Vencent/aggbug/23309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2005-12-11 02:44 <a href="http://www.blogjava.net/Vencent/articles/23309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>