<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 5.11\. GCC-4.0.3 - 第二遍 GCC 軟件包包含 GNU 編譯器集合,其中有C和C++編譯器。 **預計編譯時間:** 4.2 SBU**所需磁盤空間:** 443 MB ## 5.11.1\. 重新安裝 GCC 測試 GCC 和 Binutils 所需的工具(Tcl, Expect, DejaGNU)已經安裝好。現在 GCC 和 Binutils 將被重新編譯,連接到新的 Glibc 并作適當測試(如果運行這章中的測試的話)。注意,這些測試套件受偽終端(PTY)的影響很大,這些偽終端通常是由宿主系統通過 `devpts` 文件系統實現的。你可以用下面的方法,來測試宿主系統中PTY是否設置正常: ``` expect -c "spawn ls" ``` 如果你得到下面的回答: ``` The system has no more ptys. Ask your system administrator to create more. ``` 說明主系統的 PTY 沒設置好。這種情況下,運行 GCC 和 Binutils 的測試套件就沒什么意義了。你需要先解決主系統中的 PTY 設置問題。具體請參見 LFS 的 FAQ :[_http://www.linuxfromscratch.org/lfs/faq.html#no-ptys_](http://www.linuxfromscratch.org/lfs/faq.html#no-ptys) 。 在之前的[節 5.7, "調整工具鏈"](adjusting.html "5.7\. 調整工具鏈")中我們提到過在 GCC 編譯過程中會運行 `fixincludes` 腳本來掃描系統頭文件目錄,并找出需要修正的頭文件,然后把修正后的頭文件放到 GCC 專屬頭文件目錄里。因為現在 GCC 和 Glibc 已經安裝完畢,而且它們的頭文件已知無需修正,所以這里并不需要 `fixincludes` 腳本。另外,由于 GCC 專屬頭文件目錄會被優先搜索,結果就是 GCC 使用的頭文件是宿主系統的頭文件,而不是新安裝的那個,從而導致編譯環境被"污染"。因此必須通過下面的命令來禁止 `fixincludes` 腳本運行: ``` cp -v gcc/Makefile.in{,.orig} && sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in ``` 在[節 5.4, "GCC-4.0.3 - 第一遍"](gcc-pass1.html "5.4\. GCC-4.0.3 - 第一遍")中進行的 bootstrap 編譯使用了 `-fomit-frame-pointer` 選項,而非 bootstrap 編譯則默認忽略了該選項,所以需要使用下面的 `sed` 命令來確保在非 bootstrap 編譯時也同樣使用 `-fomit-frame-pointer` 選項,以保持一致性: ``` cp -v gcc/Makefile.in{,.tmp} && sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \ > gcc/Makefile.in ``` 使用下面的補丁修改 GCC 的缺省動態連接器(通常是 `ld-linux.so.2`)的位置: ``` patch -Np1 -i ../gcc-4.0.3-specs-1.patch ``` 上述補丁還把 `/usr/include` 從 GCC 的頭文件搜索路徑里刪掉。現在預先打補丁而不是在安裝 GCC 之后調整 specs 文件可以保證新的動態連接器在編譯 GCC 的時候就用上。也就是說,隨后的所有臨時程序都會連接到新的 Glibc 上。 ### 重要 上述補丁非常重要,為了成功編譯,千萬別忘了使用它們。 再次為編譯創建一個單獨目錄: ``` mkdir -v ../gcc-build cd ../gcc-build ``` 在開始編譯前,別忘了 unset 任何優化相關的環境變量。[是不是應當省略這句?] 為編譯 GCC 做準備: ``` ../gcc-4.0.3/configure --prefix=/tools \ --with-local-prefix=/tools --enable-clocale=gnu \ --enable-shared --enable-threads=posix \ --enable-__cxa_atexit --enable-languages=c,c++ \ --disable-libstdcxx-pch ``` **新配置選項的含義:** _`--enable-clocale=gnu`_ 本參數確保 C++ 庫在任何情況下都使用正確的 locale 模塊。如果配置腳本查找到 _de_DE_ 這個 locale ,它就會使用正確的 gnu locale 模塊。然而,如果沒有安裝 _de_DE_ ,就有可能創建出應用程序二進制接口(ABI)不兼容的 C++ 庫文件,這是因為選擇了錯誤的通用(generic) locale 模塊。 _`--enable-threads=posix`_ 使 C++ 異常能處理多線程代碼。 _`--enable-__cxa_atexit`_ 用 ___cxa_atexit_ 代替 _atexit_ 來登記 C++ 對象的本地靜態和全局析構函數,這是為了完全符合標準對析構函數的處理規定。它還會影響到 C++ ABI ,因此生成的 C++ 共享庫在其他的 Linux 發行版上也能使用。 _`--enable-languages=c,c++`_ 本參數編譯 C 和 C++ 語言的編譯器。 _`--disable-libstdcxx-pch`_ 不為 `libstdc++` 編譯預編譯頭(PCH),它占用了很大空間,但是我們用不到它。 編譯軟件包: ``` make ``` 現在沒必要用 _`bootstrap`_ 作為 make 的目標,因為這里 GCC 是用相同版本的 GCC 來編譯的,其實連源碼都一模一樣,就是在第一遍的時候安裝的那個。 現在編譯完成了,早先我們談到過,本章中的臨時工具的測試程序并不是必須運行的,如果您要運行 GCC 的測試程序,請輸入下面的命令: ``` make -k check ``` _`-k`_ 參數是讓測試套件即使遇到錯誤,也繼續運行,直到完成。GCC 的測試套件非常全面,所以基本上總是會出一些錯的。 對于測試錯誤的重要說明位于[節 6.12, "GCC-4.0.3."](../chapter06/gcc.html "6.12\. GCC-4.0.3")。 安裝軟件包: ``` make install ``` ### 小心 現在,需要停下來再一次確認新工具鏈的基本功能(編譯和連接)是否按預期工作,運行下面的命令做一個簡單的合理性檢查: ``` echo 'main(){}' > dummy.c cc dummy.c readelf -l a.out | grep ': /tools' ``` 如果一切正常,應該不會出錯,而且最后一個命令的結果應當是: ``` [Requesting program interpreter: /tools/lib/ld-linux.so.2] ``` 注意,`/tools/lib` 應該是動態連接器的前綴。 如果輸出不是像上面那樣或者根本沒有輸出,那么就有大問題了。返回并檢查前面的操作,找出問題,并改正過來。在改正之前,不要繼續后面的部份,因為這樣做沒有意義。首先,再次上述合理性檢查,用 `gcc` 代替 `cc` ,如果工作正常,那么是因為 `/tools/bin/cc` 這個符號鏈接丟失了。回頭看看[節 5.4, "GCC-4.0.3 - 第一遍,"](gcc-pass1.html "5.4\. GCC-4.0.3 - 第一遍") 并建立符號鏈接。接下來,確保 `PATH` 正確。檢查時,運行 `echo $PATH` 并檢查 `/tools/bin` 是否在列表的最前面。如果 `PATH` 錯誤,可能是因為你沒有以 `lfs` 用戶登錄,或者在 [節 4.4, "設置工作環境."](../chapter04/settingenvironment.html "4.4\. 設置工作環境")部分出錯了。另外一個原因可能是上面修正 specs 文件時出錯,如果這樣,重新修改 specs 文件,復制粘貼時小心。 在確定一切正常后,刪除測試文件: ``` rm -v dummy.c a.out ``` 關于這個軟件包的詳細資料位于[節 6.12.2, GCC 的內容](../chapter06/gcc.html#contents-gcc "6.12.2\. GCC 的內容")
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看