⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8.html

📁 介绍linux下文件和设备编程
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD>   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">   <META NAME="GENERATOR" CONTENT="《良友》v2.1, 作者:安富国,http://winking.126.com">   <TITLE>gcc</TITLE></HEAD><BODY style="font-family: 宋体; font-size: 9pt">&nbsp;<CENTER><TABLE CELLSPACING=10 CELLPADDING=10 WIDTH="60%" BGCOLOR="#FFB693" ><TR><TD ALIGN=CENTER><FONT SIZE=+2><!--标题由此开始-->gcc</TD></TR></TABLE></CENTER><p><h3>目       录</h3><!--目录由此开始--><A NAME="Content" ID="Content"></A><OL><LI><A HREF="#I194">gcc</A></LI><OL><LI><A HREF="#I195">makefile写法</A></LI><LI><A HREF="#I196">gcc_egcs使用</A></LI><LI><A HREF="#I197">gdb使用</A></LI><LI><A HREF="#I198">gcc常用选项对代码的影响</A></LI><OL><LI><A HREF="#I199">一般情况</A></LI><LI><A HREF="#I200">-O 编译选项</A></LI><LI><A HREF="#I201">-O2 编译选项</A></LI><LI><A HREF="#I202">-fomit-frame-pointer 编译选项</A></LI><LI><A HREF="#I203">-fomit-frame-pointer &amp;&amp; -O2</A></LI><LI><A HREF="#I204">-fPIC 编译选项</A></LI><LI><A HREF="#I205">-static 编译选项</A></LI></OL><LI><A HREF="#I206">AT&amp;T的汇编格式</A></LI><LI><A HREF="#I207">x86内联汇编</A></LI><OL><LI><A HREF="#I208">简述</A></LI><LI><A HREF="#I209">内联汇编</A></LI><LI><A HREF="#I210">程序模板</A></LI><LI><A HREF="#I211">操作数</A></LI><LI><A HREF="#I212">修饰寄存器列表</A></LI><LI><A HREF="#I213">操作数约束</A></LI><LI><A HREF="#I214">示例</A></LI><OL><LI><A HREF="#I215">寄存器约束</A></LI><LI><A HREF="#I216">匹配约束</A></LI><LI><A HREF="#I217">内存操作数约束</A></LI><LI><A HREF="#I218">修饰寄存器</A></LI></OL></OL><LI><A HREF="#I219">不同的CPU下最佳编译参数</A></LI><LI><A HREF="#I343">代码维护</A></LI><OL><LI><A HREF="#I344">简单cvs</A></LI><LI><A HREF="#I345">automake</A></LI><LI><A HREF="#I346">diff</A></LI><LI><A HREF="#I347">rcs</A></LI><LI><A HREF="#I732">内核重编译常见故障</A></LI><LI><A HREF="#I348">cvs</A></LI><LI><A HREF="#I349">共享库工具</A></LI><LI><A HREF="#I350">代码优化</A></LI><LI><A HREF="#I351">GNU 编码标准</A></LI><LI><A HREF="#I352">书籍</A></LI></OL></OL></OL><hr><br><A NAME="I194" ID="I194"></A><center><b><font size=+2>gcc</font></b></center><br><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I195" ID="I195"></A><center><b><font size=+2>makefile写法</font></b></center><br>蓝森林 http://www.lslnet.com 2001年3月22日 08:44<p>作 者: 许明彦<p>Abstract:<p>&nbsp;&nbsp;&nbsp; 在 Unix 上写程式的人大概都碰过 Makefile,尤其是用 C 来开发程式的人。用 make来开发和编译程式的确很方便,可是要写出一个 Makefile就不简单了。偏偏介绍 Makefile 的文件不多,GNU Make 那份印出来要几百页的文件,光看完 Overview 就快阵亡了,难怪许多<br>人闻 Unix 色变。<p>&nbsp;&nbsp;&nbsp; 本文将介绍如何利用 GNU Autoconf 及 Automake 这两套软体来协助我们『自动』产生 Makefile 档,并且让开发出来的软体可以像 Apache, MySQL 和常见的 GNU 软体一样,只要会 ``./configure'', ``make'', ``make install'' 就可以把程式安装到系统中。如果您有<br>心开发 Open Source 的软体,或只是想在 Unix 系统下写写程式。希望这份介绍文件能帮助您轻松地进入 Unix Programming 的殿堂。<p>1. 简介<p>&nbsp;&nbsp;&nbsp; Makefile 基本上就是『目标』(target), 『关连』(dependencies) 和『动作』三者所组成的一连串规则。而 make 就会根据 Makefile 的规则来决定如何编译 (compile) 和连结 (link) 程式。实际上,make 可做的不只是编译和连结程式,例如 FreeBSD 的 port collect<br>ion 中, Makefile 还可以做到自动下载原始程式套件,解压缩 (extract) ,修补 (patch),设定,然後编译,安装至系统中。<p>&nbsp;&nbsp;&nbsp; Makefile 基本构造虽然简单,但是妥善运用这些规则就也可以变出许多不同的花招。却也因此,许多刚开始学习写 Makefile 时会感到没有规范可循,每个人写出来的 Makefile 长得都不太一样,不知道从何下手,而且常常会受限於自己的开发环境,只要环境变数不同或路<br>径改一下,可能Makefile 就得跟着修改。虽然有 GNU Makefile Conventions (GNU Makefile 惯例) 订出一些使用 GNU 程式设计时撰写 Makefile 的一些标准和规范,但是内容很长而且很复杂, 并且经常做些调整,为了减轻程式设计师维护 Makefile 的负担,因此有了Automake。<p>&nbsp;&nbsp;&nbsp; 程式设计师只需写一些预先定义好的巨集 (macro),交给 Automake 处理後会产生一个可供Autoconf 使用的 Makefile.in 档。再配合利用Autoconf 产生的自动设定档 configure即可产生一份符合 GNU Makefile惯例的 Makeifle 了。<p>2. 上路之前<p>&nbsp;&nbsp;&nbsp; 在开始试着用 Automake 之前,请先确认你的系统已经安装以下的软体:<br>1. GNU Automake<br>2. GNU Autoconf<br>3. GNU m4<br>4. perl<br>5. GNU Libtool (如果你需要产生 shared library)<p>&nbsp;&nbsp;&nbsp; 我会建议你最好也使用 GNU C/C++ 编译器 、GNU Make 以及其它 GNU 的工具程式来做为开发的环境,这些工具都是属於 Open Source Software不仅免费而且功能强大。如果你是使用Red Hat Linux 可以找到所有上述软体的 rpm 档,FreeBSD 也有现成的 package 可以直<br>接安装,或着你也可以自行下载这些软体的原始档回来 DIY。以下的范例是在 Red Hat Linux 5.2 + CLE2 的环境下所完成的。<p>3. 一个简单的例子<p>&nbsp;&nbsp;&nbsp; Automake 所产生的 Makefile 除了可以做到程式的编译和连结,也已经把如何产生程式文件(如 manual page, info 档及 dvi 档) 的动作,还有把原始程式包装起来以供散 的动作都考虑进去了,所以原始程式所存放的目录架构最好符合 GNU 的标准惯例,接下来我拿hello.c 来做为例子。<p>&nbsp;&nbsp;&nbsp; 在工作目录下建立一个新的子目录 ``devel'',再在 devel 下建立一个``hello'' 的子目录,这个目录将作为我们存放 hello 这个程式及其相关档案的地方:<p>% mkdir devel<br>% cd devel<br>% mkdir hello<br>% cd hello<p>用编辑器写个 hello.c 档,<br>#include stdio.h<br>int main(int argc, char** argv)<br>{<br>printf(``Hello, GNU! '');<br>return 0;<br>}<p>&nbsp;&nbsp;&nbsp; 接下来就要用 Autoconf 及 Automake 来帮我们产生 Makefile 档了,<p>1. 用 autoscan 产生一个 configure.in 的雏型,执行 autoscan 後会产生一个configure.scan 的档案,我们可以用它做为configure.in档的蓝本。<p>% autoscan<br>% ls<br>configure.scan hello.c<p>2. 编辑 configure.scan 档,如下所示,并且把它的档名改成configure.in<br>dnl Process this file with autoconf to produce a con figure script.<br>AC_INIT(hello.c)<br>AM_INIT_AUTOMAKE(hello, 1.0)<br>dnl Checks for programs.<br>AC_PROG_CC<br>dnl Checks for libraries.<br>dnl Checks for header files.<br>dnl Checks for typedefs, structures, and compiler ch aracteristics.<br>dnl Checks for library functions.<br>AC_OUTPUT(Makefile)<p>3. 执行 aclocal 和 autoconf ,分别会产生 aclocal.m4 及 configure 两个档案<br>% aclocal<br>% autoconf<br>% ls<br>aclocal.m4 configure configure.in hello.c<p>4. 编辑 Makefile.am 档,内容如下<br>AUTOMAKE_OPTIONS= foreign<br>bin_PROGRAMS= hello<br>hello_SOURCES= hello.c<p>5. 执行 automake --add-missing ,Automake 会根据 Makefile.am 档产生一些档案,包含最重要的 Makefile.in<br>% automake --add-missing<br>automake: configure.in: installing `./install-sh'<br>automake: configure.in: installing `./mkinstalldirs'<br>automake: configure.in: installing `./missing'<p>6. 最後执行 ./configure ,<br>% ./configure<br>creating cache ./config.cache<br>checking for a BSD compatible install... /usr/bin/in stall -c<br>checking whether build environment is sane... yes<br>checking whether make sets ${MAKE}... yes<br>checking for working aclocal... found<br>checking for working autoconf... found<br>checking for working automake... found<br>checking for working autoheader... found<br>checking for working makeinfo... found<br>checking for gcc... gcc<br>checking whether the C compiler (gcc ) works... yes<br>checking whether the C compiler (gcc ) is a cross-co mpiler... no<br>checking whether we are using GNU C... yes<br>checking whether gcc accepts -g... yes<br>updating cache ./config.cache<br>creating ./config.status<br>creating Makefile<p>&nbsp;&nbsp;&nbsp; 现在你的目录下已经产生了一个 Makefile 档,下个 ``make'' 指令就可以开始编译 hello.c 成执行档,执行 ./hello 和 GNU 打声招呼吧!<p>% make<br>gcc -DPACKAGE=&quot;hello&quot; -DVERSION=&quot;1.0&quot; -I. -I. -g -O2 -c he llo.c<br>gcc -g -O2 -o hello hello.o<br>% ./hello<br>Hello! GNU!<p>&nbsp;&nbsp;&nbsp; 你还可以试试 ``make clean'',''make install'',''make dist'' 看看会有什麽结果。你也可以把产生出来的 Makefile 秀给你的老板,让他从此对你刮目相看 :-)<p>4. 一探究竟<p>&nbsp;&nbsp;&nbsp; 上述产生 Makefile 的过程和以往自行编写的方式非常不一样,舍弃传统自行定义 make 的规则,使用 Automake 只需用到一些已经定义好的巨集即可。我们把巨集及目标 (target)写在 Makefile.am 档内,Automake读入 Makefile.am 档後会把这一串已经定义好的巨集展<br>开并且产生对应的Makefile.in 档, 然後再由 configure 这个 shell script 根据Makefile.in 产生适合的 Makefile。<br>&nbsp;&nbsp;&nbsp; 在此范例中可藉由 Autoconf 及 Automake 工具所产生的档案有 configure.scan、aclocal.m4、configure、Makefile.in,需要我们加入设定者为 configure.in 及 Makefile.am。<p>4.1 编辑 configure.in 档<p>&nbsp;&nbsp;&nbsp; Autoconf 是用来产生 'configure' 档的工具。'configure' 是一个shell script,它可以自动设定原始程式以符合各种不同平台上 Unix 系统的特性,并且根据系统叁数及环境产生合适的 Makefile 档或是C 的标头档 (header file),让原始程式可以很方便地在这些不同<br>的平台上被编译出来。Autoconf 会读取 configure.in 档然後产生 'configure' 这个shell script。<p>&nbsp;&nbsp;&nbsp; configure.in 档的内容是一连串 GNU m4 的巨集,这些巨集经过autoconf 处理後会变成检查系统特徵的 shell script。configure.in 内巨集的顺序并没有特别的规定,但是每一个 configure.in 档必须在所有巨集前加入 AC_INIT 巨集,然後在所有巨集的最後面加上 AC<br>_OUTPUT 巨集。我们可先用 autoscan 扫描原始档以产生一个 configure.scan 档,再对 configure.scan 做些修改成 configure.in 档。在范例中所用到的巨集如下:<p>dnl<br>&nbsp;&nbsp;&nbsp; 这个巨集後面的字不会被处理,可视为注解。<p>AC_INIT(FILE)<br>&nbsp;&nbsp;&nbsp; 这个巨集用来检查原始码所在的路径,autoscan 会自动产生,我们不必修改它。<p>AM_INIT_AUTOMAKE(PACKAGE,VERSION)<br>&nbsp;&nbsp;&nbsp; 这是使用 Automake 所必备的巨集,PACKAGE 是我们所要产生软体套件的名称,VERSION 是版本编号。<p>AC_PROG_CC<br>&nbsp;&nbsp;&nbsp; 检查系统可用的 C 编译器,如果原始程式是用 C 写的就需要这个巨集。<p>AC_OUTPUT(FILE)<br>&nbsp;&nbsp;&nbsp; 设定 configure 所要产生的档案,如果是 Makefile 的话,configure 便会把它检查出来的结果带入 Makefile.in 档然後产生<br>合适的 Makefile。<p>&nbsp;&nbsp;&nbsp; 实际上,我们使用 Automake 时,还须要一些其它的巨集,这些额外的巨集我们用 aclocal来帮我们产生。执行 aclocal 会产生 aclocal.m4档,如果没有特别的用途,我们可以不必修改它,用 aclocal 所产生的巨集会告诉 Automake 怎麽做。<p>&nbsp;&nbsp;&nbsp; 有了 configure.in 及 aclocal.m4 两个档案後,便可以执行 autoconf来产生 configure档了。<p>4.2 编辑 Makefile.am 档<p>&nbsp;&nbsp;&nbsp; 接下来我们要编辑 Makefile.am 档,Automake 会根据 configure.in 中的巨集把Makefile.am 转成 Makefile.in 档。Makefile.am 档定义我们所要产的目标:<p>AUTOMAKE_OPTIONS<br>&nbsp;&nbsp;&nbsp; 设定 automake 的选项。Automake 主要是帮助开发 GNU 软体的人员维护软体套件,所以在执行 automake 时,会检查目录下是否存在标准 GNU 软体套件中应具备的文件档案,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件档。设成 foreign 时,automake 会改用一般软<br>体套件的标准来检查。<p>bin_PROGRAMS<br>&nbsp;&nbsp;&nbsp; 定义我们所要产生的执行档档名。如果要产生多个执行档,每个档名用空白字元隔开。<p>hello_SOURCES<br>&nbsp;&nbsp;&nbsp; 定义 'hello' 这个执行档所需要的原始档。如果 'hello' 这个程式是由多个原始档所产生,必须把它所用到的原始档都列出来,以空白字元隔开。假设 'hello' 这个程式需要 'hello.c'、'main.c'、<p>'hello.h'<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -