freebsd 开发手册.html

来自「freebsd开发者手册, 感兴趣的可以看看, 不错呀.」· HTML 代码 · 共 1,696 行 · 第 1/5 页

HTML
1,696
字号
<div class="INFORMALEXAMPLE"><a id="AEN458" name="AEN458"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc -O -o foobar foobar.c</kbd>       </pre></div><p>这会产生一个优化版本的 <tt class="FILENAME">foobar</tt>。</p></dd></dl></div><p>  下面的三个参数会迫使 <tt class="COMMAND">cc</tt> 检查你的代码是否符合一些国际标准,经常被我们叫做 <acronym class="ACRONYM">ANSI</acronym>标准,虽然严格的来说它是一个 <acronym class="ACRONYM">ISO</acronym> 标准。</p><div class="VARIABLELIST"><dl><dt><code class="OPTION">-Wall</code></dt><dd><p>打开所有 <tt class="COMMAND">cc</tt> 的作者认为值得注意的警告。不要只看这个选项的名字,它并没有打开所有 <tt class="COMMAND">cc</tt> 能够注意到的所有警告。</p></dd><dt><code class="OPTION">-ansi</code></dt><dd><p>关闭大多数,但并不是所有,<tt class="COMMAND">cc</tt> 提供的非 <acronymclass="ACRONYM">ANSI</acronym>&nbsp;C 特性。不要只看选项的名字,它并不严格保证你的代码会兼容标准。</p></dd><dt><code class="OPTION">-pedantic</code></dt><dd><p>关闭 <span class="emphasis"><b class="EMPHASIS">所有</b></span> <ttclass="COMMAND">cc</tt> 的非 <acronym class="ACRONYM">ANSI</acronym>&nbsp;C 特性。</p></dd></dl></div><p>  没有这些选项,<tt class="COMMAND">cc</tt> 能允许你按照标准使用一些非标准的扩展。有一些扩展非常有用,但不能与其他编译器兼容──实际上,这个标准的主要目的之一就是允许我们写出可以在任何系统上的由任何编译器编译的代码。这就叫做 <iclass="FIRSTTERM">可移植代码</i></p><p>  通常来说,你应该让你的代码尽可能的可以移植。否则你就不得不完全重写你的代码以便能够在其他地方运行之──而且谁知道几年后你是否还会用它?</p><div class="INFORMALEXAMPLE"><a id="AEN495" name="AEN495"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbdclass="USERINPUT">cc -Wall -ansi -pedantic -o foobar foobar.c</kbd></pre></div><p>  这会在检查 <tt class="FILENAME">foobar.c</tt>对标准的兼容性以后产生一个 <ttclass="FILENAME">foobar</tt> 可执行文件。</p><div class="VARIABLELIST"><dl><dt><code class="OPTION">-l<tt class="REPLACEABLE"><i>library</i></tt></code></dt><dd><p>在连接的时候指定一个函数库。</p><p>最常见的情况就是当你编译一个使用了一些 C 中的数学函数的时候。不像大多数其他的平台,这些函数都不在 C 的标准库里面。你必须告诉编译器加 上这些库。</p><p>这个规则就是,如果库的名字叫做 <tt class="FILENAME">lib<ttclass="REPLACEABLE"><i>something</i></tt>.a</tt>,你就必 须给 <tt class="COMMAND">cc</tt>这样的选项 <code class="OPTION">-l<ttclass="REPLACEABLE"><i>something</i></tt></code>。例如,数学库 叫做 <ttclass="FILENAME">libm.a</tt>,因此你给 <tt class="COMMAND">cc</tt> 的选 项就是 <codeclass="OPTION">-lm</code>。一般情况下,我们要把这个选项放到命令行的 最后。</p><div class="INFORMALEXAMPLE"><a id="AEN519" name="AEN519"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc -o foobar foobar.c -lm</kbd>       </pre></div><p>这个会把数学函数库连接到 <tt class="FILENAME">foobar</tt> 里面。</p><p>如果你要编译 C++ 代码,你需要 <code class="OPTION">-lg++</code>,或者 <codeclass="OPTION">-lstdc++</code> 如果你使用的是 FreeBSD 2.2 或者更高版本,来 连接 C++库。或者,你可以运行 <tt class="COMMAND">c++</tt> 而不是 <tt class="COMMAND">cc</tt>来编译 C++ 代码。在 FreeBSD 上, <tt class="COMMAND">c++</tt> 也可以通过运行 <ttclass="COMMAND">g++</tt> 来唤醒。</p><div class="INFORMALEXAMPLE"><a id="AEN532" name="AEN532"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc -o foobar foobar.cc-lg++</kbd>     对于 FreeBSD 2.1.6 或者更低的版本<samp class="PROMPT">%</samp> <kbdclass="USERINPUT">cc -o foobar foobar.cc -lstdc++</kbd>对 FreeBSD 2.2 或者更高的版本<samp class="PROMPT">%</samp> <kbd class="USERINPUT">c++ -o foobar foobar.cc</kbd>       </pre></div><p>两种情况都会从 C++ 源文件 <tt class="FILENAME">foobar.cc</tt>产生一个 可执行文件 <ttclass="FILENAME">foobar</tt>。注意,在 <span class="TRADEMARK">UNIX</span> 系统中,C++ 源文件的传统后缀是 <tt class="FILENAME">.C</tt>,<tt class="FILENAME">.cxx</tt> 或 者 <ttclass="FILENAME">.cc</tt>,而不是 <span class="TRADEMARK">MS-DOS</span>&reg; 类型的 <ttclass="FILENAME">.cpp</tt> (这个后缀已经被用到了其他的地方)。 <ttclass="COMMAND">gcc</tt> 根据这个约定来确定应该使用何种类型的编译器来编译源文件。但是,这个限制不再起作用了,因此现在你可以自由的使用 <ttclass="FILENAME">.cpp</tt> 这个后缀来命名你的 C++ 源文件!</p></dd></dl></div><div class="SECT2"><hr /><h3 class="SECT2"><a id="AEN553" name="AEN553">2.4.1 常见 <tt class="COMMAND">cc</tt>问题</a></h3><div class="QANDASET"><dl><dt>2.4.1.1. <a href="#Q2.4.1.1.">我尝试写一个程序,其中使用了 <codeclass="FUNCTION">sin()</code> 这个函数。但是我却得到了如下的错误。这个错误是什么意思?</a></dt><dt>2.4.1.2. <a href="#Q2.4.1.2.">好的,我写了一个简单的程序,练习使用 <codeclass="OPTION">-lm</code>。也 就是计算 2.1 的 6 次方。</a></dt><dt>2.4.1.3. <a href="#Q2.4.1.3.">那么我怎么才能改正这个错误?</a></dt><dt>2.4.1.4. <a href="#Q2.4.1.4.">我编译了一个文件叫 <tt class="FILENAME">foobar.c</tt>但是我没有找 到叫 <tt class="FILENAME">foobar</tt>的执行文件。这个文件到哪里去了?</a></dt><dt>2.4.1.5. <a href="#Q2.4.1.5.">好的,我有一个执行文件 <ttclass="FILENAME">foobar</tt>,我用命令 <tt class="COMMAND">ls</tt>可以看见,但是在命令行我输入 <tt class="COMMAND">foobar</tt>却得到提示说没有这个文件。为什么找不到呢?</a></dt><dt>2.4.1.6. <a href="#Q2.4.1.6.">我的可执行文件叫做 <ttclass="FILENAME">test</tt>,但是我运行之后却 什么也没发生。到底怎么了?</a></dt><dt>2.4.1.7. <ahref="#Q2.4.1.7.">我编译了一个程序,开始看起来运行得不错。但是后来调试了,说什么 “<ttclass="ERRORNAME">core dumped</tt>”。这个是什么意思?</a></dt><dt>2.4.1.8. <a href="#Q2.4.1.8.">挺不错,但现在我该怎么办呢?</a></dt><dt>2.4.1.9. <a href="#Q2.4.1.9.">我的程序把 core dump 以后,说有一个什么 “<ttclass="ERRORNAME">segmentation fault</tt>”。这是什么?</a></dt><dt>2.4.1.10. <a href="#Q2.4.1.10.">有时候当我得到一个 core dump,提示说 “<ttclass="ERRORNAME">bus error</tt>”。我的 <span class="TRADEMARK">UNIX</span>教材里面说这意味这硬件错误,但是计算 机看起来运行很正常。这是真的吗?</a></dt><dt>2.4.1.11. <a href="#Q2.4.1.11.">如果我可以让 core dump在需要的时候产生,那就真的很不错。我能 这样做吗,或者我得等直到发生一个错误?</a></dt></dl><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q2.4.1.1." name="Q2.4.1.1."></a><b>2.4.1.1.</b> 我尝试写一个程序,其中使用了<code class="FUNCTION">sin()</code> 这个函数。但是我却得到了如下的错误。这个错误是什么意思?</p><div class="INFORMALEXAMPLE"><a id="AEN561" name="AEN561"></a><pre class="SCREEN">/var/tmp/cc0143941.o: Undefined symbol `_sin' referenced from text segment         </pre></div></div><div class="ANSWER"><p><b></b>当使用像 <code class="FUNCTION">sin()</code> 这样的数学函数的时候,你必 须告诉<tt class="COMMAND">cc</tt> 把数学函数库给连接进来,就像这样:</p><div class="INFORMALEXAMPLE"><a id="AEN567" name="AEN567"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc -o foobar foobar.c -lm</kbd>         </pre></div></div></div><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q2.4.1.2." name="Q2.4.1.2."></a><b>2.4.1.2.</b>好的,我写了一个简单的程序,练习使用 <code class="OPTION">-lm</code>。也 就是计算 2.1 的6 次方。</p><div class="INFORMALEXAMPLE"><a id="AEN575" name="AEN575"></a><pre class="PROGRAMLISTING">#include &lt;stdio.h&gt;int main() {    float f;    f = pow(2.1, 6);    printf("2.1 ^ 6 = %f\n", f);    return 0;}         </pre></div><p>然后我编译:</p><div class="INFORMALEXAMPLE"><a id="AEN578" name="AEN578"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc temp.c -lm</kbd>         </pre></div><p>就像你说的我应该做的那样。但是我在运行的时候却有如下提示:</p><div class="INFORMALEXAMPLE"><a id="AEN583" name="AEN583"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">./a.out</kbd>2.1 ^ 6 = 1023.000000         </pre></div><p>这个 <span class="emphasis"><b class="EMPHASIS">不</b></span>是正确的答案!到底怎么了?</p></div><div class="ANSWER"><p><b></b>当编译器看见你调用了一个函数,它会检查是否已经有了一个相配合的 原始类型(prototype),如果没有,编译器会假定函数的返回值是 <span class="TYPE">整数</span>,恰恰不是你的程序想要的结果。</p></div></div><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q2.4.1.3." name="Q2.4.1.3."></a><b>2.4.1.3.</b>那么我怎么才能改正这个错误?</p></div><div class="ANSWER"><p><b></b>数学函数的声明原型都在 <tt class="FILENAME">math.h</tt> 里面。如果你引用了这个文件,编译器就能找到这个原型然后就不会对你的计算做奇怪的 干扰。</p><div class="INFORMALEXAMPLE"><a id="AEN598" name="AEN598"></a><pre class="PROGRAMLISTING">#include &lt;math.h&gt;#include &lt;stdio.h&gt;int main() {...         </pre></div><p>像以前一样编译,然后再运行:</p><div class="INFORMALEXAMPLE"><a id="AEN601" name="AEN601"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">./a.out</kbd>2.1 ^ 6 = 85.766121         </pre></div><p>如果你使用了任何一个数学函数,<span class="emphasis"><bclass="EMPHASIS">一定</b></span>要记得 引用 <tt class="FILENAME">math.h</tt>这个文件,并且连接数学函数库。</p></div></div><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q2.4.1.4." name="Q2.4.1.4."></a><b>2.4.1.4.</b> 我编译了一个文件叫 <ttclass="FILENAME">foobar.c</tt> 但是我没有找 到叫 <tt class="FILENAME">foobar</tt>的执行文件。这个文件到哪里去了?</p></div><div class="ANSWER"><p><b></b>记住,除非你指定一个名字,<tt class="COMMAND">cc</tt>会把编译出的文 件叫做 <ttclass="FILENAME">a.out</tt>。使用 <code class="OPTION">-o&nbsp;<ttclass="REPLACEABLE"><i>filename</i></tt></code> 这个选 项:</p><div class="INFORMALEXAMPLE"><a id="AEN619" name="AEN619"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc -o foobar foobar.c</kbd>         </pre></div></div></div><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q2.4.1.5." name="Q2.4.1.5."></a><b>2.4.1.5.</b> 好的,我有一个执行文件 <ttclass="FILENAME">foobar</tt>,我用命令 <tt class="COMMAND">ls</tt>可以看见,但是在命令行我输入 <tt class="COMMAND">foobar</tt>却得到提示说没有这个文件。为什么找不到呢?</p></div><div class="ANSWER"><p><b></b>不像 <span class="TRADEMARK">MS-DOS</span>,<span class="TRADEMARK">UNIX</span>不会在当前目录寻找你想执行的文件,除非你 指定这样做。可以输入 <ttclass="COMMAND">./foobar</tt>,意思是 “在当 前目录下运行文件 <ttclass="FILENAME">foobar</tt>。”,也可以改变环 境变量 <tt class="ENVAR">PATH</tt>像这个样子</p><div class="INFORMALEXAMPLE"><a id="AEN637" name="AEN637"></a><pre class="SCREEN">bin:/usr/bin:/usr/local/bin:.         </pre></div><p>最后的那个点的意思就是 “如果在其他任何目录找不到,在当前 目录中寻找。”</p></div></div><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q2.4.1.6." name="Q2.4.1.6."></a><b>2.4.1.6.</b> 我的可执行文件叫做 <ttclass="FILENAME">test</tt>,但是我运行之后却 什么也没发生。到底怎么了?</p></div><div class="ANSWER"><p><b></b>大多数 <span class="TRADEMARK">UNIX</span> 系统在 <ttclass="FILENAME">/usr/bin</tt> 下有一个程 序叫做 <tt class="COMMAND">test</tt>。Shell会先检查这个程序然后在检查当前 目录寻找可执行文件。可以输入:</p><div class="INFORMALEXAMPLE"><a id="AEN650" name="AEN650"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">./test</kbd>         </pre>

⌨️ 快捷键说明

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