建與深度環(huán)境配置指南)
簡(jiǎn)介編譯器是軟件開(kāi)發(fā)的核心工具負(fù)責(zé)將高級(jí)語(yǔ)言代碼轉(zhuǎn)換為機(jī)器可執(zhí)行的指令。其工作原理涉及詞法分析、語(yǔ)法分析、優(yōu)化和代碼生成等多個(gè)階段是現(xiàn)代軟件工程基礎(chǔ)設(shè)施的基石。從源碼構(gòu)建編譯器不僅能獲得特定版本支持如C20新特性還能實(shí)現(xiàn)針對(duì)特定CPU架構(gòu)如ARM、RISC-V的交叉編譯定制這對(duì)于嵌入式開(kāi)發(fā)、高性能計(jì)算和系統(tǒng)級(jí)編程具有重要技術(shù)價(jià)值。在實(shí)際應(yīng)用場(chǎng)景中開(kāi)發(fā)者常需為服務(wù)器部署特定版本環(huán)境或?yàn)榍度胧皆O(shè)備構(gòu)建專(zhuān)用工具鏈。本文以GCC 10.1.0為例詳細(xì)解析從源碼包到可執(zhí)行編譯器的完整構(gòu)建過(guò)程涵蓋依賴(lài)解析、配置優(yōu)化等關(guān)鍵環(huán)節(jié)幫助開(kāi)發(fā)者掌握構(gòu)建環(huán)境的主動(dòng)權(quán)。1. 項(xiàng)目概述從源碼包到強(qiáng)大的編譯器手頭拿到一個(gè)gcc-10.1.0.tar.gz的壓縮包對(duì)于很多剛接觸 Linux 系統(tǒng)開(kāi)發(fā)、嵌入式交叉編譯或者希望深度定制編譯工具鏈的朋友來(lái)說(shuō)這可能就是一段漫長(zhǎng)而充實(shí)的旅程的起點(diǎn)。GCC全稱(chēng) GNU Compiler Collection早已超越了其最初“C編譯器”的范疇成長(zhǎng)為支持 C、C、Fortran、Go、Ada 等多種語(yǔ)言的編譯器套件是開(kāi)源世界的基石之一。這個(gè)以版本號(hào) 10.1.0 和.tar.gz后綴標(biāo)識(shí)的文件意味著我們將要面對(duì)的是 GCC 的完整源代碼需要通過(guò)編譯和安裝才能將其轉(zhuǎn)化為我們系統(tǒng)上可用的強(qiáng)大工具。為什么我們要費(fèi)時(shí)費(fèi)力地從源碼編譯而不是直接使用系統(tǒng)包管理器如apt、yum安裝呢原因有幾個(gè)層面。首先版本控制你的 Linux 發(fā)行版?zhèn)}庫(kù)提供的 GCC 版本可能比較保守例如 Ubuntu 20.04 LTS 默認(rèn)是 gcc-9而你的項(xiàng)目可能需要 C20 的某些特性這些特性在 gcc-10 中才得到更完善的支持。其次定制化需求你可能需要為特定的 CPU 架構(gòu)如 ARM、RISC-V進(jìn)行交叉編譯或者需要禁用某些你不用的語(yǔ)言前端以減少編譯時(shí)間和磁盤(pán)占用。再者安裝位置靈活從源碼安裝允許你將 GCC 安裝到非標(biāo)準(zhǔn)路徑如/opt/gcc-10.1.0避免污染系統(tǒng)目錄方便多版本共存和管理。最后學(xué)習(xí)與排障親手走一遍配置、編譯、安裝的全過(guò)程能讓你對(duì)編譯器這套龐大系統(tǒng)的構(gòu)成、依賴(lài)關(guān)系有更深刻的理解日后遇到鏈接庫(kù)錯(cuò)誤、ABI 不兼容等問(wèn)題時(shí)你的排查思路會(huì)清晰得多。這個(gè)過(guò)程適合所有不滿(mǎn)足于“黑盒”使用工具、希望掌握構(gòu)建環(huán)境主動(dòng)權(quán)的開(kāi)發(fā)者。無(wú)論是想在服務(wù)器上部署特定版本的編譯環(huán)境還是為嵌入式板卡構(gòu)建交叉工具鏈亦或是單純想了解一個(gè)大型開(kāi)源項(xiàng)目是如何從源代碼變成可執(zhí)行文件的編譯 GCC 都是一項(xiàng)極具價(jià)值的實(shí)踐。2. 編譯環(huán)境準(zhǔn)備與依賴(lài)解析在解壓那個(gè)tar.gz文件之前我們必須先把“地基”打好。一個(gè)不完整的構(gòu)建環(huán)境會(huì)導(dǎo)致編譯過(guò)程在某個(gè)階段詭異失敗錯(cuò)誤信息可能令人費(fèi)解。因此系統(tǒng)性的準(zhǔn)備工作至關(guān)重要。2.1 系統(tǒng)基礎(chǔ)環(huán)境確認(rèn)首先確保你在一個(gè)類(lèi) Unix 系統(tǒng)上操作比如 Linux 發(fā)行版Ubuntu, CentOS, Fedora 等或者 macOS通過(guò) Homebrew 環(huán)境。雖然 GCC 本身可以編譯成 Windows 原生版本即 MinGW-w64 項(xiàng)目所做的但在 Windows 上從零開(kāi)始編譯 GCC 源碼異常復(fù)雜通常不推薦。更常見(jiàn)的做法是在 Windows 上使用 MSYS2 或 WSLWindows Subsystem for Linux來(lái)獲得一個(gè)類(lèi) Unix 環(huán)境進(jìn)行操作。檢查你的磁盤(pán)空間。編譯 GCC 10.1.0 及其依賴(lài)尤其是如果開(kāi)啟 bootstrap 和所有語(yǔ)言需要大約 10-15 GB 的臨時(shí)磁盤(pán)空間在/tmp或你的構(gòu)建目錄。安裝目錄本身也需要 2-4 GB。請(qǐng)務(wù)必確保有足夠空間否則編譯可能在數(shù)小時(shí)后因空間不足而失敗。2.2 構(gòu)建工具與核心依賴(lài)安裝GCC 的編譯過(guò)程依賴(lài)于一系列基礎(chǔ)工具和庫(kù)。以下是在基于 Debian/Ubuntu 和 RHEL/CentOS 系統(tǒng)上的安裝命令。其他發(fā)行版請(qǐng)參考其包管理器的對(duì)應(yīng)包名。對(duì)于 Ubuntu/Debiansudo apt update sudo apt install build-essential sudo apt install libgmp-dev libmpfr-dev libmpc-dev sudo apt install texinfo bison flex sudo apt install m4 automake libtool pkg-config sudo apt install zlib1g-dev libexpat1-dev對(duì)于 RHEL/CentOS/Fedorasudo yum groupinstall “Development Tools” sudo yum install gmp-devel mpfr-devel libmpc-devel sudo yum install texinfo bison flex sudo yum install m4 automake libtool pkgconfig sudo yum install zlib-devel expat-devel讓我們拆解一下這些依賴(lài)的作用build-essential / Development Tools這是元包包含了gcc,g,make,libc-dev等最基礎(chǔ)的編譯工具鏈。有趣的是我們正在編譯新的 GCC卻需要舊版本的 GCC 作為“種子編譯器”bootstrap compiler。這聽(tīng)起來(lái)像“雞生蛋”的問(wèn)題但系統(tǒng)自帶的 GCC 就是這個(gè)“最初的蛋”。libgmp-dev, libmpfr-dev, libmpc-devel這三個(gè)是數(shù)學(xué)庫(kù)GCC 在編譯優(yōu)化階段進(jìn)行常數(shù)折疊、浮點(diǎn)運(yùn)算等需要高精度數(shù)學(xué)計(jì)算時(shí)依賴(lài)它們。它們是 GCC 的“硬依賴(lài)”必須安裝。texinfoGCC 的文檔系統(tǒng)如info格式的手冊(cè)需要它來(lái)生成。如果缺少編譯可能不會(huì)失敗但你會(huì)失去本地文檔。bison, flex語(yǔ)法分析器生成器。GCC 的某些語(yǔ)言前端如 C、C 的解析器使用它們。雖然現(xiàn)代 GCC 源碼包可能已包含生成的 C 代碼但為了安全起見(jiàn)和可能的重新生成最好安裝。m4, automake, libtool, pkg-config這些是 GNU 構(gòu)建系統(tǒng)Autotools的常用工具。GCC 雖然使用自己的構(gòu)建系統(tǒng)但其依賴(lài)的某些庫(kù)或它自身的一部分可能用到這些工具。zlib1g-dev, libexpat1-dev壓縮庫(kù)和 XML 解析庫(kù)。一些輔助工具或特性如調(diào)試信息壓縮、某些配置文件解析可能會(huì)用到。注意網(wǎng)絡(luò)上有些教程會(huì)提到安裝glibc開(kāi)發(fā)包。請(qǐng)注意glibc是 C 標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)通常系統(tǒng)自帶且版本固定。不要嘗試升級(jí)或從源碼安裝與你當(dāng)前系統(tǒng)不匹配的glibc這極有可能導(dǎo)致系統(tǒng)崩潰。GCC 編譯時(shí)會(huì)鏈接系統(tǒng)現(xiàn)有的glibc。2.3 源碼獲取與解壓假設(shè)你已經(jīng)將gcc-10.1.0.tar.gz下載到了~/src目錄。我們?cè)诖四夸浵虏僮?。cd ~/src tar -xzf gcc-10.1.0.tar.gz cd gcc-10.1.0解壓后建議先花幾分鐘瀏覽一下頂級(jí)目錄的結(jié)構(gòu)gcc/編譯器的核心包含所有語(yǔ)言前端、中端優(yōu)化器和后端代碼生成器。libgcc/編譯器運(yùn)行時(shí)庫(kù)如處理整數(shù)除零、軟浮點(diǎn)運(yùn)算的庫(kù)。libstdc-v3/GNU 的 C 標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)。libgomp/OpenMP 運(yùn)行時(shí)庫(kù)。以及其他如libatomic,libitm事務(wù)內(nèi)存等運(yùn)行時(shí)庫(kù)。configure,Makefile.in這是 Autotools 風(fēng)格的配置和構(gòu)建腳本入口。3. 配置詳解為你的需求定制 GCC進(jìn)入解壓后的源碼目錄最關(guān)鍵的一步就是運(yùn)行configure腳本。這個(gè)腳本會(huì)探測(cè)你的系統(tǒng)環(huán)境并生成針對(duì)該環(huán)境優(yōu)化的Makefile。GCC 的配置選項(xiàng)繁多理解常用選項(xiàng)能幫你打造最合適的編譯器。3.1 創(chuàng)建獨(dú)立的構(gòu)建目錄一個(gè)非常重要的最佳實(shí)踐是不要在源碼目錄內(nèi)直接編譯。應(yīng)該創(chuàng)建一個(gè)獨(dú)立的構(gòu)建目錄build directory。這樣做的好處是保持源碼樹(shù)的純凈并且允許你從同一個(gè)源碼目錄針對(duì)不同配置如不同目標(biāo)架構(gòu)、不同安裝前綴進(jìn)行多次構(gòu)建互不干擾。cd ~/src mkdir gcc-10.1.0-build cd gcc-10.1.0-build3.2 核心配置選項(xiàng)解析現(xiàn)在從構(gòu)建目錄運(yùn)行配置腳本指向源碼目錄。一個(gè)典型的配置命令如下../gcc-10.1.0/configure \ --prefix/opt/gcc-10.1.0 \ --enable-languagesc,c \ --disable-multilib \ --enable-threadsposix \ --enable-checkingrelease \ --disable-bootstrap \ --with-system-zlib \ --with-gmp/usr \ --with-mpfr/usr \ --with-mpc/usr讓我們逐條解析這些選項(xiàng)--prefix/opt/gcc-10.1.0指定安裝目錄。這是最重要的選項(xiàng)之一。將其安裝到/opt下可以方便地管理多個(gè)版本。安裝后編譯器的可執(zhí)行文件將在/opt/gcc-10.1.0/bin庫(kù)文件在/opt/gcc-10.1.0/lib頭文件在/opt/gcc-10.1.0/include。如果不設(shè)置默認(rèn)會(huì)安裝到/usr/local這可能與系統(tǒng)包管理器安裝的軟件產(chǎn)生沖突。--enable-languagesc,c指定要編譯的語(yǔ)言前端。GCC 支持很多語(yǔ)言c, c, fortran, go, ada, objc, obj-c等。只啟用你需要的語(yǔ)言可以顯著減少編譯時(shí)間和磁盤(pán)占用。對(duì)于大多數(shù)開(kāi)發(fā)者c,c就足夠了。--disable-multilib禁用多庫(kù)支持。Multilib 允許編譯器生成針對(duì)不同 ABI如 32 位和 64 位的代碼。如果你的目標(biāo)環(huán)境是純 64 位系統(tǒng)并且不需要編譯 32 位程序禁用它可以簡(jiǎn)化構(gòu)建過(guò)程并避免一些潛在的庫(kù)路徑問(wèn)題。--enable-threadsposix啟用 POSIX 線程支持。這對(duì)于 C 標(biāo)準(zhǔn)庫(kù)libstdc正確支持thread等特性至關(guān)重要?,F(xiàn)代系統(tǒng)基本都是 POSIX 線程。--enable-checkingrelease在編譯器內(nèi)部啟用一定級(jí)別的自檢但設(shè)置為release級(jí)別以減少性能開(kāi)銷(xiāo)。如果是為了調(diào)試 GCC 本身可以設(shè)為yes或更詳細(xì)的級(jí)別但這會(huì)極大增加編譯時(shí)間并降低生成的編譯器性能。--disable-bootstrap禁用“自舉”編譯。GCC 的標(biāo)準(zhǔn)構(gòu)建過(guò)程是“自舉”的先用系統(tǒng)編譯器stage1編譯一遍 GCC再用剛編好的 GCCstage1編譯第二遍stage2最后用 stage2 編譯第三遍stage3并比較 stage2 和 stage3 的結(jié)果以確保正確性。這個(gè)過(guò)程非常耗時(shí)。--disable-bootstrap表示只編譯一遍stage1這能節(jié)省大量時(shí)間適合日常使用。對(duì)于發(fā)布正式版本或追求極致穩(wěn)定性才啟用 bootstrap。--with-system-zlib和--with-gmp/usr等告訴配置腳本使用系統(tǒng)已安裝的 zlib、GMP、MPFR、MPC 庫(kù)而不是嘗試去編譯 GCC 源碼樹(shù)內(nèi)自帶的副本。這通常更安全也更快。3.3 針對(duì)特定場(chǎng)景的配置交叉編譯如果你想構(gòu)建一個(gè)能在 ARM 設(shè)備上運(yùn)行的 GCC例如arm-linux-gnueabihf-gcc你需要指定--target、--host和--build三元組。例如在 x86_64 Linux 上為 ARM 構(gòu)建../gcc-10.1.0/configure \ --prefix/opt/gcc-arm-10.1.0 \ --targetarm-linux-gnueabihf \ --enable-languagesc,c \ --disable-multilib \ --with-archarmv7-a \ --with-fpuvfpv3-d16 \ --with-floathard這需要你先安裝好對(duì)應(yīng)目標(biāo)平臺(tái)的 C 庫(kù)頭文件和二進(jìn)制工具如binutils通常它們被打包成類(lèi)似gcc-arm-linux-gnueabihf這樣的工具鏈。優(yōu)化編譯速度如果你機(jī)器核心多可以加上--enable-parallel-mark針對(duì)垃圾收集對(duì)某些語(yǔ)言有用并在后續(xù)make時(shí)使用-j選項(xiàng)。配置階段本身是單線程的。運(yùn)行configure腳本后它會(huì)檢查所有依賴(lài)是否滿(mǎn)足并最終輸出一個(gè)摘要。請(qǐng)仔細(xì)閱讀最后幾行確認(rèn)沒(méi)有“ERROR”級(jí)別的錯(cuò)誤只有一些“WARNING”通??梢越邮芾缒承┛蛇x的庫(kù)如 ISL 或 CLooG 沒(méi)找到。4. 編譯與安裝漫長(zhǎng)的構(gòu)建之旅配置成功后構(gòu)建目錄下會(huì)生成Makefile。接下來(lái)就是最耗時(shí)的部分編譯。4.1 啟動(dòng)編譯過(guò)程使用make命令開(kāi)始編譯。為了充分利用多核 CPU 大幅縮短時(shí)間使用-j選項(xiàng)指定并行任務(wù)數(shù)。一個(gè)常見(jiàn)的經(jīng)驗(yàn)法則是設(shè)置為 CPU 邏輯核心數(shù)的 1 到 1.5 倍。例如對(duì)于 8 核 CPUmake -j12整個(gè)編譯過(guò)程可能會(huì)持續(xù)幾十分鐘到數(shù)小時(shí)取決于你的 CPU 性能、啟用的語(yǔ)言數(shù)量以及是否開(kāi)啟 bootstrap。期間你的終端會(huì)輸出海量的編譯命令。只要沒(méi)有以錯(cuò)誤信息終止就讓它安靜地運(yùn)行。你可以觀察 CPU 使用率是否飽和以及是否有規(guī)律地輸出“Linking CXX executable...”等信息這些都是正常進(jìn)行的標(biāo)志。實(shí)操心得編譯過(guò)程中如果遇到錯(cuò)誤首先查看錯(cuò)誤信息的最后部分。GCC 編譯錯(cuò)誤通常很冗長(zhǎng)但根源往往在開(kāi)頭或結(jié)尾。常見(jiàn)的失敗原因包括依賴(lài)庫(kù)版本不匹配特別是 GMP/MPFR/MPC、磁盤(pán)空間不足、內(nèi)存不足OOM Killer 殺掉了編譯進(jìn)程。如果遇到關(guān)于sanitizer或特定目標(biāo)文件的錯(cuò)誤嘗試先make clean然后只編譯單個(gè)目錄或者降低并行度make -j2來(lái)排查。4.2 安裝前的可選測(cè)試編譯完成后強(qiáng)烈建議運(yùn)行測(cè)試套件以驗(yàn)證你編譯的 GCC 在本地環(huán)境是否正常工作。這步非常耗時(shí)但能提供質(zhì)量保證。make -k check-k選項(xiàng)表示“繼續(xù)執(zhí)行”即使某些測(cè)試失敗。測(cè)試結(jié)果會(huì)匯總在gcc/testsuite/*.sum和*.log文件中。你可以重點(diǎn)關(guān)注gcc.sum和g.sum。對(duì)于非發(fā)布用途如果失敗測(cè)試不多尤其是與特定硬件架構(gòu)或極端優(yōu)化相關(guān)的測(cè)試通??梢越邮堋H绻霈F(xiàn)大量核心測(cè)試失敗則表明編譯可能有問(wèn)題。4.3 正式安裝到系統(tǒng)測(cè)試通過(guò)或選擇性跳過(guò)后使用install目標(biāo)進(jìn)行安裝。這需要你擁有對(duì)--prefix指定目錄的寫(xiě)權(quán)限。sudo make install安裝過(guò)程會(huì)將所有必要的可執(zhí)行文件、庫(kù)、頭文件、手冊(cè)頁(yè)等復(fù)制到/opt/gcc-10.1.0或你指定的路徑目錄下。4.4 安裝后的環(huán)境配置安裝完成后系統(tǒng)默認(rèn)的gcc命令仍然指向舊版本。為了讓系統(tǒng)找到我們新安裝的 GCC 10.1.0需要修改環(huán)境變量PATH和LD_LIBRARY_PATH。方法一臨時(shí)生效針對(duì)當(dāng)前 Shell 會(huì)話export PATH/opt/gcc-10.1.0/bin:$PATH export LD_LIBRARY_PATH/opt/gcc-10.1.0/lib64:/opt/gcc-10.1.0/lib:$LD_LIBRARY_PATH方法二永久生效針對(duì)用戶(hù)將上述兩行添加到你的~/.bashrc或~/.zshrc文件末尾。echo ‘export PATH/opt/gcc-10.1.0/bin:$PATH’ ~/.bashrc echo ‘export LD_LIBRARY_PATH/opt/gcc-10.1.0/lib64:/opt/gcc-10.1.0/lib:$LD_LIBRARY_PATH’ ~/.bashrc source ~/.bashrc方法三使用update-alternatives管理系統(tǒng)級(jí)版本Debian/Ubuntu這是一個(gè)更優(yōu)雅的管理多版本 GCC 的方法sudo update-alternatives --install /usr/bin/gcc gcc /opt/gcc-10.1.0/bin/gcc 100 \ --slave /usr/bin/g g /opt/gcc-10.1.0/bin/g sudo update-alternatives --config gcc然后通過(guò)交互菜單選擇默認(rèn)的 GCC 版本。配置完成后驗(yàn)證安裝gcc --version g --version此時(shí)應(yīng)該顯示 “gcc (GCC) 10.1.0”。恭喜你一個(gè)由你親手從源碼編譯的 GCC 已經(jīng)就緒。5. 常見(jiàn)問(wèn)題與深度排障指南即便按照步驟操作你也可能會(huì)遇到一些“坑”。這里匯總了常見(jiàn)問(wèn)題及其解決方案。5.1 編譯過(guò)程中的典型錯(cuò)誤問(wèn)題一configure: error: Building GCC requires GMP 4.2, MPFR 3.1.0 and MPC 0.8.0原因雖然安裝了開(kāi)發(fā)包但版本過(guò)低或者configure腳本沒(méi)找到它們。排查檢查已安裝版本dpkg -s libgmp-dev | grep Version或rpm -q gmp-devel。如果版本夠但找不到可能是庫(kù)路徑問(wèn)題。使用--with-gmp/usr/local如果庫(kù)安裝在非標(biāo)準(zhǔn)路徑。最穩(wěn)妥的方法是手動(dòng)編譯安裝這三個(gè)庫(kù)的最新版到某個(gè)獨(dú)立目錄如/opt/libs然后在 configure 時(shí)指定--with-gmp/opt/libs --with-mpfr/opt/libs --with-mpc/opt/libs。問(wèn)題二fatal error: stdio.h: No such file or directory原因缺少 C 標(biāo)準(zhǔn)庫(kù)頭文件。在基于 Debian 的系統(tǒng)上你可能安裝了gcc但沒(méi)裝libc6-dev。在 RHEL 上glibc-headers包可能缺失。解決安裝對(duì)應(yīng)的包sudo apt install libc6-dev或sudo yum install glibc-headers glibc-devel。問(wèn)題三編譯中途失敗報(bào)錯(cuò)internal compiler error: Killed (program cc1plus)原因這通常是系統(tǒng)內(nèi)存或交換空間耗盡Linux 內(nèi)核的 OOM Killer 殺掉了編譯進(jìn)程。解決減少并行編譯任務(wù)make -j2。增加交換空間創(chuàng)建一個(gè)交換文件sudo fallocate -l 4G /swapfile sudo mkswap /swapfile sudo swapon /swapfile。關(guān)閉內(nèi)存密集型應(yīng)用。問(wèn)題四ld: cannot find -lgcc_s或類(lèi)似鏈接錯(cuò)誤原因LD_LIBRARY_PATH沒(méi)有正確設(shè)置或者新編譯的 GCC 運(yùn)行時(shí)庫(kù)路徑?jīng)]有被鏈接器找到。解決確保LD_LIBRARY_PATH包含了新 GCC 的lib和lib64目錄并且在使用gcc命令時(shí)該環(huán)境變量已生效。對(duì)于靜態(tài)鏈接或特殊構(gòu)建系統(tǒng)可能需要傳遞-Wl,-rpath,/opt/gcc-10.1.0/lib64鏈接器選項(xiàng)。5.2 安裝后使用時(shí)的疑難雜癥問(wèn)題五運(yùn)行g(shù)cc --version顯示的還是舊版本原因PATH環(huán)境變量中舊版本 GCC 的路徑如/usr/bin仍然在新版本路徑之前。排查執(zhí)行which gcc和echo $PATH查看哪個(gè)gcc被優(yōu)先找到。調(diào)整PATH變量的順序確保/opt/gcc-10.1.0/bin在/usr/bin之前。問(wèn)題六編譯自己的程序時(shí)提示GLIBCXX_3.4.XX’ not found原因你的程序動(dòng)態(tài)鏈接到了新編譯的libstdc.so但運(yùn)行時(shí)系統(tǒng)加載器找不到它。因?yàn)樾掳姹镜?C 庫(kù)包含舊版本沒(méi)有的符號(hào)。解決確保運(yùn)行環(huán)境如另一臺(tái)服務(wù)器或容器也安裝了相同版本 GCC 的運(yùn)行時(shí)庫(kù)或者將libstdc.so打包進(jìn)你的程序分發(fā)。在編譯你的程序時(shí)可以嘗試靜態(tài)鏈接 C 標(biāo)準(zhǔn)庫(kù)使用-static-libstdc但這會(huì)增大二進(jìn)制文件體積。最根本的方法是在目標(biāo)系統(tǒng)上也設(shè)置好LD_LIBRARY_PATH指向包含新庫(kù)的目錄。問(wèn)題七交叉編譯工具鏈工作不正常原因交叉編譯需要“配套”的binutils如arm-linux-gnueabihf-as,ld和C庫(kù)如glibc或musl。如果只編譯了 GCC 而沒(méi)有正確配置這些依賴(lài)工具鏈?zhǔn)菬o(wú)法生成可運(yùn)行程序的。解決交叉編譯工具鏈的構(gòu)建是一個(gè)系統(tǒng)工程通常建議使用crosstool-NG或類(lèi)似工具來(lái)自動(dòng)化完成它會(huì)處理好 GCC、binutils、C庫(kù)、內(nèi)核頭文件之間的版本匹配和配置依賴(lài)。手動(dòng)構(gòu)建極其復(fù)雜。5.3 性能調(diào)優(yōu)與清理編譯一次 GCC 會(huì)占用大量臨時(shí)空間。構(gòu)建目錄~/src/gcc-10.1.0-build在安裝后可以安全刪除以釋放空間cd ~/src rm -rf gcc-10.1.0-build源碼目錄gcc-10.1.0可以保留以備未來(lái)打補(bǔ)丁或重新配置編譯。如果你需要卸載這個(gè)手動(dòng)安裝的 GCC直接刪除安裝目錄即可sudo rm -rf /opt/gcc-10.1.0同時(shí)記得從你的~/.bashrc和update-alternatives中移除相關(guān)配置。從gcc-10.1.0.tar.gz這樣一個(gè)源碼包開(kāi)始到獲得一個(gè)功能完備的編譯器這個(gè)過(guò)程本身就是一個(gè)極佳的學(xué)習(xí)路徑。它迫使你去理解構(gòu)建系統(tǒng)的運(yùn)作、庫(kù)的依賴(lài)關(guān)系、以及系統(tǒng)環(huán)境變量的重要性。下次當(dāng)你再遇到“gcc升級(jí)后為啥還是舊版本”這類(lèi)困惑時(shí)你就能清晰地知道問(wèn)題可能出在PATH的優(yōu)先級(jí)、update-alternatives的配置或是動(dòng)態(tài)鏈接庫(kù)的查找路徑上。這種從底層構(gòu)建得來(lái)的掌控感是直接使用二進(jìn)制包無(wú)法比擬的。本文還有配套的精品資源點(diǎn)擊獲取