日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀] 一、C/C++文件的編譯過程: 先來看一下gcc的使用方法和常用選項 提示:gcc --help Ⅰ、使用方法: gcc [選項] 文件名 Ⅱ、常用選項:

一、C/C++文件的編譯過程: 先來看一下gcc的使用方法和常用選項

提示:gcc --help

Ⅰ、使用方法: gcc [選項] 文件名 Ⅱ、常用選項: 選項 含義 -v 查看gcc編譯器的版本,顯示gcc執(zhí)行時的詳細(xì)過程 -o Place the output into ;指定輸出文件名為file,這個名稱不能跟源文件名同名 -E Preprocess only; do not compile, assemble or link;只預(yù)處理,不會編譯、匯編、鏈接 -S Compile only; do not assemble or link;只編譯,不會匯編、鏈接 -c Compile and assemble, but do not link; 編譯和匯編,不會鏈接 一個C/C++文件要經(jīng)過預(yù)處理(preprocessing)、編譯(compilation)、匯編(assembly)、和連接(linking)才能變成可執(zhí)行文件。

以下列程序為例,追層來分析編譯過程。
hello.c:

#include 

#define   MAX  20 
#define   MIN  10 

#define  _DEBUG
#define   SetBit(x)  (1<
① 預(yù)處理: gcc -E -o hello.i hello.c

預(yù)處理就是將要包含(include)的文件插入原文件中、將宏定義展開、根據(jù)條件編譯命令選擇要使用的代碼,最后將這些代碼輸出到一個“.i”文件中等待進(jìn)一步處理。
② 編譯: gcc -S -o hello.s hello.i

編譯就是把C/C++代碼(比如上面的”.i”文件)“翻譯”成匯編代碼。 ③ 匯編: gcc -c -o hello.o hello.s

.o:object file(OBJ文件) 這里表現(xiàn)為二進(jìn)制目標(biāo)文件:

匯編就是將第二步輸出的匯編代碼翻譯成符合一定格式的機(jī)器代碼,在Linux系統(tǒng)上一般表現(xiàn)位ELF目標(biāo)文件(OBJ文件)。 ④ 鏈接: gcc -o hello hello.o

鏈接就是將匯編生成的OBJ文件、系統(tǒng)庫的OBJ文件、庫文件鏈接起來,最終生成可以在特定平臺運(yùn)行的可執(zhí)行程序。
總結(jié):在編譯過程中。除非使用了”-c”,“-S”,或”-E”選項(或者編譯錯誤阻止了完整的過程),否則統(tǒng)一完整鏈接步驟。

譬如:gcc hello.cgcc -o hello hello.c都已經(jīng)完成鏈接操作。

又如:gcc -c -o hello.o hello.c

二、鏈接原理: gcc -c -o hello.o hello.c 不作最后一步鏈接,得到hello.o二進(jìn)制OBJ文件 gcc -v -o hello hello.o 我們來看一樣鏈接過程是怎樣的:
book@www.100ask.org:/work/gcc_options/1th$ gcc -v -o hello hello.o
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.4' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'hello' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccbhavbV.res 
 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s 
 -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc 
 -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id 
 --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed 
 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro 
 -o hello 
 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o 
 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o 
 /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o 
 -L/usr/lib/gcc/x86_64-linux-gnu/5 
 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu 
 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib 
 -L/lib/x86_64-linux-gnu -L/lib/../lib 
 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib 
 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../..  
 hello.o 
 -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed 
 /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o 
 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o
book@www.100ask.org:/work/gcc_options/1th$
crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系統(tǒng)標(biāo)準(zhǔn)啟動文件,對于一般應(yīng)用程序,這些啟動是必需的。 -lc:鏈接libc庫文件,其中l(wèi)ibc庫文件中就實現(xiàn)了printf等函數(shù)。 ① 動態(tài)鏈接:動態(tài)鏈接使用動態(tài)鏈接庫進(jìn)行鏈接,生成的程序在執(zhí)行的時候需要加載所需的動態(tài)庫才能運(yùn)行。 動態(tài)鏈接生成的程序體積較小,但是必須依賴所需的動態(tài)庫,否則無法執(zhí)行。

默認(rèn)使用動態(tài)鏈接:gcc -o hello_shared hello.o

② 靜態(tài)鏈接:靜態(tài)鏈接使用靜態(tài)庫進(jìn)行鏈接,生成的程序包含程序運(yùn)行所需要的全部庫,可以直接運(yùn)行,不過靜態(tài)鏈接生成的程序體積較大。

gcc -static -o hello_static hello.o

③ -nostartfiles

不鏈接系統(tǒng)標(biāo)準(zhǔn)啟動文件,而標(biāo)準(zhǔn)庫文件仍然正常使用:
gcc -v -nostartfiles -o hello hello.o

④ -nostdlib(最常用)

不鏈接系統(tǒng)標(biāo)準(zhǔn)啟動文件和標(biāo)準(zhǔn)庫文件:
gcc -v -nostdlib -o hello hello.o


- 會提示因為沒有鏈接系統(tǒng)標(biāo)準(zhǔn)啟動文件和標(biāo)準(zhǔn)庫文件,而鏈接失敗。
- 這個-nostdlib選項常用于裸機(jī)/bootloader、linux內(nèi)核等程序,因為它們不需要啟動文件、標(biāo)準(zhǔn)庫文件。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉