wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2324|回復: 0
打印 上一主題 下一主題
收起左側

C項目的文件組織和GCC編譯步驟分解

[復制鏈接]
跳轉到指定樓層
樓主
ID:912806 發表于 2021-8-26 11:41 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
本帖最后由 michaelchain 于 2021-8-26 11:45 編輯

C項目的文件組織和編譯
C項目的代碼, 由頭文件(.h后綴)和C文件(.c后綴)組成
  • C語言的函數和變量, 分聲明和定義兩個階段
  • 頭文件和C文件是等價的, 相當于C文件的一部分, 其功能由人為劃分, 用于變量和函數的聲明, 頭文件也可以用于變量和函數的定義, 但是這屬于非標準用法, 一般不這么用
  • 同一個編譯中, 函數在一處定義, 處處可用(除非使用static關鍵字)
    • 在A.c中定義后, 在B.c中用extern聲明這個函數, 就可以調用
    • 將A.c中的函數聲明提取到A.h, 在B.c中include A.h, 或者通過B.c include B.h, B.h include A.h, 都可以實現函數引用
  • C的編譯, 是按文件編譯的, 每個C文件會編譯為一個目標文件
  • 頭文件不單獨編譯, 與include這個頭文件的C文件, 在預編譯階段展開, 之后在C文件中編譯
  • 編譯需要知道C文件的列表和頭文件的目錄列表
  • 編譯會依次編譯C文件列表中的每個文件, 不管最終是否用到
C項目結構示例
定義一個頭文件 inc.h,聲明兩個函數func1和func2, 將定義寫在func1.c和func2.c. 在main.c中通過main.h引用inc.h, 調用這些函數, 程序目錄結構如下
  1. ├── inc
  2. │   ├── func1.c
  3. │   ├── func2.c
  4. │   └── inc.h
  5. ├── main.c
  6. ├── main.h
  7. └── obj
復制代碼

main.c
  1. #include <stdio.h>
  2. #include "main.h"

  3. int main()
  4. {
  5.   uint8_t a = 0x08;
  6.   uint8_t b = func1(a);
  7.   printf("%X", b);
  8.   return 0;
  9. }
復制代碼

main.h
  1. #ifndef MAIN_H
  2. #define MAIN_H

  3. #include "inc.h"

  4. #endif
復制代碼

inc.h
  1. #ifndef INC_H
  2. #define INC_H

  3. typedef unsigned char uint8_t;

  4. uint8_t func1(uint8_t a);
  5. uint8_t func2(uint8_t a);

  6. #endif
復制代碼

func1.c
  1. #include "inc.h"

  2. uint8_t func1(uint8_t a)
  3. {
  4.   a = a << 1;
  5.   return a;
  6. }
復制代碼

func2.c
  1. #include "inc.h"

  2. uint8_t func2(uint8_t a)
  3. {
  4.   a = a >> 1;
  5.   return a;
  6. }
復制代碼

gcc的編譯過程
gcc命令其實依次執行了四步操作
  • 預處理(Preprocessing),
  • 編譯(Compilation),
  • 匯編(Assemble),
  • 鏈接(Linking)


1.預處理(Preprocessing)
預處理用于將所有的#include頭文件以及宏定義替換成其真正的內容,預處理之后得到的仍然是文本文件,但文件體積會大很多。gcc的預處理是預處理器cpp來完成的,你可以通過如下命令對 main.c進行預處理:
gcc -E -I./inc main.c -o obj/main.i# or$ cpp main.c -I./inc -o obj/main.i
-E是讓編譯器在預處理之后就退出,不進行后續編譯過程; -I指定頭文件目錄, -o指定輸出文件名.
經過預處理之后代碼體積會大很多, main.c只有10行, 但是main.i有749行, 預處理之后的文件可以用文本編輯器查看

2.編譯(Compilation)
這一步的編譯將經過預處理之后的程序轉換成特定匯編代碼的過程, 編譯的命令如下:
$ gcc -S -I./inc main.c -o obj/main.s
-S讓編譯器在編譯之后停止. 這一步會生成程序的匯編代碼, 內容如下:
        .file        "main.c"
        .text
        .section        .rodata
.LC0:
        .string        "%X"
        .text
        .globl        main
        .type        main, @function
main:
.LFB0:
        .cfi_startproc
        endbr64
        pushq        %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq        %rsp, %rbp
        .cfi_def_cfa_register 6
        subq        $16, %rsp
        movb        $8, -2(%rbp)
        movzbl        -2(%rbp), %eax
        movl        %eax, %edi
        call        func1@PLT
        movb        %al, -1(%rbp)
        movzbl        -1(%rbp), %eax
        movl        %eax, %esi
        leaq        .LC0(%rip), %rdi
        movl        $0, %eax
        call        printf@PLT
        movl        $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size        main, .-main
        .ident        "GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"
        .section        .note.GNU-stack,"",@progbits
        .section        .note.gnu.property,"a"
        .align 8
        .long         1f - 0f
        .long         4f - 1f
        .long         5
0:
        .string         "GNU"
1:
        .align 8
        .long         0xc0000002
        .long         3f - 2f
2:
        .long         0x3
3:
        .align 8
4:


3.匯編(Assemble)
匯編過程將上一步的匯編代碼轉換成機器碼(machine code),這一步產生了二進制的目標文件, gcc匯編過程通過as命令完成
as obj/main.s -o obj/main.o# porgcc -c obj/main.s -o obj/main.o
這一步需要給每一個源文件產生一個目標文件, 以便后面link
gcc -c -I./inc inc/func1.c -o obj/func1.ogcc -c -I./inc inc/func2.c -o obj/func2.o

4.鏈接(Linking)
通過上面的步驟, 在obj目錄下已經有main.o, func1.o和func2.o這三個目標文件, 現在需要通過linker將這些目標文以及所需的庫文件(.so等)鏈接成最終的可執行文件(executable file)
命令如下
gcc -o obj/main obj/main.o obj/func1.o obj/func2.o
這時候在obj目錄下就會生成可執行文件main

鏈接并不會忽略未使用的目標文件
上面的編譯產生的main文件大小為16824字節, 不管在main中是否調用了func1或者func2.
如果在link中去掉func2.o (因為main中未調用func2, 所以不會產生錯誤), 這樣產生的main文件為16760字節
gcc -o obj/main obj/main.o obj/func1.o
如果需要減小尺寸, 可以使用 -fdata-sections -ffunction-sections -Wl --gc-sections -Os等參數優化. 例如
gcc -Os -fdata-sections -ffunction-sections test.cpp -o test -Wl,--gc-sections

頭文件, 靜態庫(.lib, .a) 和動態庫(.dll, .so)靜態庫 vs 動態庫
庫文件就是已經預編譯好的目標文件, 只需要link到你的程序里就可以用了, 例如常見的方法 printf() and sqrt(). 庫文件有兩種類型: 靜態庫和動態庫(也叫共享庫).
靜態庫 在Linux下使用擴展名.a, 在Windows下使用擴展名.lib, 當link靜態庫時, 這些對象文件的機器碼會被復制到你的可執行文件中.
動態庫 在Linux下使用擴展每.so, 在Windows下使用擴展名.dll, 當你的程序link靜態庫時, 只會在你的程序可執行文件中添加一個表, 在運行你的程序之前, 操作系統會將這些外部方法的機器碼載入進來. 這種方式可以節約磁盤資源, 讓程序更小, 另外大多數操作系統也運行內存中的一份動態庫在多個運行的程序中共享. 動態庫升級時無需重新編譯執行程序.
GCC默認情況下以動態庫方式link. 要查看庫內容, 可以用命令nm filename

編譯中定位包含頭文件和庫文件 (-I, -L and -l)
當編譯項目時, 編譯器需要頭文件的信息, linker需要庫文件解決外部依賴.
對于項目中include的頭文件, 編譯器會去搜索相應的路徑, 這些路徑通過 -Idir 參數 ( 或者環境變量 CPATH) 指定, 因為頭文件的文件名是已知的, 所以編譯器只需要知道路徑.
對于linker, 會去搜索庫路徑, 這個通過 -Ldir 參數 (大寫 'L' 后面是路徑) (或者環境變量 LIBRARY_PATH). 另外你需要指定庫名稱. 在Unix系統中, 庫文件 libxxx.a 通過參數 -lxxx 指定 (小寫字符 'l' 不帶lib前綴, 不帶.a擴展名). 在Windows下, 需要提供文件全名, 例如 -lxxx.lib. 路徑和文件名都需要指定.

默認的 Include-paths, Library-paths 和 Libraries
可以通過cpp -v命令列出:
> cpp -v......#include "..." search starts here:#include <...> search starts here: /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/include /usr/include /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../lib/../include/w32api
在編譯時, 加入-v參數開啟verbose mode, 可以了解系統中使用到的庫路徑(-L)以及庫明細(-l)
> gcc -v -o hello.exe hello.c......-L/usr/lib/gcc/x86_64-pc-cygwin/6.4.0-L/usr/x86_64-pc-cygwin/lib-L/usr/lib-L/lib-lgcc_s     // libgcc_s.a-lgcc       // libgcc.a-lcygwin    // libcygwin.a-ladvapi32  // libadvapi32.a-lshell32   // libshell32.a-luser32    // libuser32.a-lkernel32  // libkernel32.a
Eclipse CDT 在 Eclipse CDT 中, 可以在項目上右鍵, 點擊project ⇒ Properties ⇒ C/C++ General ⇒ Paths and Symbols, 在標簽頁"Includes", "Library Paths" and "Libraries"下, 設置 include path, library paths 和 libraries.

GCC環境變量
GCC 使用下列環境變量:
  • PATH: 用于搜索可執行文件和運行時的動態鏈接庫(.dll, .so).
  • CPATH: 用于搜索頭文件包含路徑. 優先級低于直接用-I<dir>指定的路徑. C_INCLUDE_PATH and CPLUS_INCLUDE_PATH可分別用于指定C和C++的頭文件路徑.
  • LIBRARY_PATH: 用于搜索庫文件的路徑, 優先級低于用-L<dir>指定的路徑.

參考

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
亚洲国产精品大全| 国产又大又黄视频| 欧美在线aaa| 三上悠亚久久精品| 国产乱子伦精品视频| 91免费网站视频| 国产免费色视频| 亚洲精品日韩在线| 欧美丰满一区二区免费视频| 欧美中文一区二区三区| 欧美日韩精品二区第二页| 欧美午夜电影在线播放| 欧美精品久久99久久在免费线| 在线观看免费亚洲| 欧美精品欧美精品系列| 日韩精品一区二区在线观看| 精品国产凹凸成av人导航| 亚洲激情第一页| 一区二区三区天堂av| 精品国内产的精品视频在线观看| 久久精视频免费在线久久完整在线看| 久久精品国产96久久久香蕉| 欧美大尺度激情区在线播放| 69视频在线免费观看| 国产成人综合一区二区三区| 亚洲一区二区日本| 欧美亚洲另类久久综合| 国产91视频一区| 激情婷婷综合网| 亚洲精品久久久久久| 国产女主播喷水高潮网红在线| 任你操精品视频| 国产精品黄色大片| 99视频在线观看免费| 久草网站在线| 香蕉视频在线观看www| 男女午夜刺激视频| 日韩有码电影| av老司机免费在线| 国产在线不卡一区二区三区| av成人资源网| 一区二区三区毛片免费| 石原莉奈在线亚洲三区| av电影在线观看一区| 亚洲乱码中文字幕| 538在线一区二区精品国产| 亚洲精品视频免费| 国内精品视频久久| 国产精品一区二区三区不卡| 亚洲自拍偷拍一区二区三区| 宅男噜噜噜66国产免费观看| 99久久国产精| 久久机热这里只有精品| 国产精品毛片一区二区在线看舒淇| 亚洲成年人电影网站| 欧美做受喷浆在线观看| 五月天av网站| 一级黄色短视频| 久久精品国产麻豆| 操操操综合网| 一级黄色录像大片| 国产精品入口麻豆高清| 最近中文字幕mv第三季歌词 | 欧美变态xxxx| 成人在线播放免费观看| 国产精品亚洲欧美日韩一区在线| 久久一级电影| 国产精品99久久久久久久女警| 亚洲日本中文字幕区| 欧美一区日本一区韩国一区| 欧美精品中文字幕一区| 电影午夜精品一区二区三区| 国产中文字幕二区| 国产又粗又猛又爽视频| 11024精品一区二区三区日韩| 国产亚洲精品久久久网站好莱| 超碰在线中文| 日韩欧美一区二区三区在线观看 | 国产乱国产乱老熟| 中文先锋资源| 有色激情视频免费在线| 成人香蕉视频| 91精品国产自产拍在线观看蜜| 国产精品综合一区二区三区| 午夜成人在线视频| 国产亚洲精品久久久久久| 亚洲va欧美va在线观看| 国产人妻777人伦精品hd| 亚洲午夜久久久久久久久红桃| 波多野结衣视频在线看| 嫩草视频在线免费观看| 色女人在线视频| 国产欧美日韩在线一区二区| 国产成人精品三级| 欧美亚洲国产怡红院影院| 欧美成人全部免费| 日韩av电影免费播放| 精品国产乱码久久久久久1区二区| 日韩成人免费在线观看| 国产一卡2卡3卡4卡网站免费| 青青青免费视频在线2| 日韩成人精品| 精品亚洲国内自在自线福利| 色诱视频网站一区| 69av成年福利视频| 国产视频九色蝌蚪| 久久高清免费视频| 黄色免费直接看| 亚洲最大网站| 欧美亚洲自偷自偷| 狠狠躁18三区二区一区| 97精品欧美一区二区三区| 狠狠干视频网站| 小嫩苞一区二区三区| 综合图区欧美| 在线观看免费视频你懂的| 日本五码在线| 97se亚洲| 不卡av电影在线播放| 91精品国产一区二区| 91精品国产综合久久香蕉最新版| wwwwww.色| 中文无码精品一区二区三区| 成人精品3d动漫| 日本高清久久| 91视频www| 亚洲性69xxxbbb| 日韩av不卡在线播放| jizz中文字幕| 国产精品伦一区二区三区级视频频 | 宅男网站在线免费观看| 羞羞色午夜精品一区二区三区| 国产精品视频一二三区| 精品国产一区二区三区久久| 成人在线观看毛片| 久久久久久久久久免费视频| 97在线观看播放| 日本高清久久| 久久久久久久综合日本| 在线亚洲国产精品网| 亚洲一区二区在线观| 久久网免费视频| 国产91白丝在线播放| 亚洲精品在线国产| 久久久久亚洲综合| 欧美成人免费全部观看天天性色| 波多野结衣之无限发射| 在线观看国产精品视频| 国产一二在线观看| 欧美另类专区| 91国产成人在线| 风间由美久久久| 人人爽人人爽人人片| 青春草在线观看视频| 欧美影院视频| 国产精品久久久久永久免费观看 | 欧美国产精品一二三| 成品网站w灬+源码1688网页 | 图片一区二区| 93久久精品日日躁夜夜躁欧美| 在线视频一区二区| 欧美色图色综合| 成人激情四射网| 黄色的视频在线观看| 精品一区二区在线播放| 精品一区二区三区电影| 中文字幕免费高| 国产精品h视频| 日韩免费av网站| 国产一区精品| 久久综合图片| 亚洲精品自拍视频| 波多野结衣家庭教师在线| 国产极品久久久| 丁香花电影在线观看完整版| 精品系列免费在线观看| 日韩一区二区av| the porn av| 日韩视频www| 95精品视频| 亚洲色图一区二区| 91久热免费在线视频| 娇小11一12╳yⅹ╳毛片| 国外亚洲成av人片在线观看| 99精品一区| 欧美一区二区精品久久911| 四虎免费在线观看视频| 国产男男gay体育生网站| 国产网红在线观看| proumb性欧美在线观看| 91产国在线观看动作片喷水| 久久精品国产亚洲av麻豆| 97高清视频| 亚洲区一区二| 一色桃子一区二区| 欧美日韩精品区别| 免费vip影院| 羞羞色午夜精品一区二区三区| 日韩三级av在线播放| 欧美日本视频在线观看| 色94色欧美一区| 欧美日韩直播| 欧美日韩久久久一区| www.一区二区.com| 男女啪啪无遮挡| 福利在线一区| 欧美日韩一区二区三区高清| 国风产精品一区二区| 亚洲色图欧美视频| 国产精品99久久免费观看| 一本一本大道香蕉久在线精品 | 国产午夜一区二区| 在线免费黄色小视频| av影音资源网| 亚洲黄页一区| 久久视频在线观看免费| 好男人香蕉影院| 真不卡电影网| 人妻有码中文字幕| 人人做人人爽人人爱| 在线一区免费| 正在播放亚洲1区| 国产激情视频网站| 中文字幕av在线播放| 久久99精品久久久久久动态图 | 亚洲精品第一国产综合野草社区| 新67194成人永久网站| 欧美成人免费视频| 国产亚洲精品久久久久久豆腐| 在线视频1卡二卡三卡| 精品众筹模特私拍视频| 亚洲精品日产精品乱码不卡| 欧美日本国产精品| 手机看片1024国产| 免费短视频成人日韩| 亚洲精品ady| 国产精品日日摸夜夜爽| 影音先锋导航| 国产精品亚洲人在线观看| 国产精品入口夜色视频大尺度| 日韩精品成人一区| 国产成人免费9x9x人网站视频 | 日韩中文字幕三区| xfplay先锋影音夜色资源站| 香蕉成人久久| 日本中文字幕久久看| 中文字幕激情小说| 欧美天堂一区二区| 欧美一区二区三区视频| 麻豆精品国产传媒| 国产在线观看高清视频| 日本一区二区在线不卡| 天堂社区 天堂综合网 天堂资源最新版| xxxx69hd| 国产精品99一区二区| 国产69精品99久久久久久宅男| 久久久久久久福利| 九七电影院97理论片久久tvb| 欧美日韩一二三区| 黄色片免费网址| 黄色毛片在线看| 国产精品免费av| 日韩亚洲欧美一区二区| h网站在线观看| 国产激情视频一区二区在线观看 | 91麻豆国产精品| 亚洲av激情无码专区在线播放| 欧美精品一区二区三区精品| 精品国产欧美一区二区三区成人 | 中文字幕亚洲精品| 欧美xxxx中国| 国内精品久久久久久影视8| 亚洲av综合一区| 日韩a级大片| 欧美xxxx做受欧美| 天堂在线免费观看视频| 成人午夜网址| 中文字幕一精品亚洲无线一区| 欧美精品久久久久性色| 国产精品一区二区美女视频免费看 | 色播五月综合网| 精品推荐蜜桃传媒| 夜夜爽夜夜爽精品视频| 北条麻妃视频在线| 一区二区三区在线免费观看视频| 祥仔av免费一区二区三区四区| 欧美精品一区二| 麻豆天美蜜桃91| 日韩精品中文字幕一区二区| 国产亚洲精品一区二555| 69精品久久久| 久久精品论坛| 欧美激情亚洲自拍| 国产日韩免费视频| 激情视频一区| 91在线观看免费观看 | 亚洲成av人片一区二区密柚| 欧美一区二区三区免费观看 | 国产精品99久久久久久www| 免费看av毛片| 亚洲综合另类| 九色一区二区| 春意影院在线| 欧美激情中文字幕一区二区| 国产 日韩 欧美在线| 精品三级久久久久久久电影聊斋| 亚洲午夜精品在线| 中文字幕在线国产| 天堂av在线网| 亚洲精品永久免费| 欧美男人亚洲天堂| 婷婷综合久久| 亚洲www在线| freexxxx性特大另类| 欧美国产激情一区二区三区蜜月| 久久综合久久色| 特级毛片在线| 亚洲第一页中文字幕| 国产精品xxxx喷水欧美| 四虎成人av| 亚洲aⅴ日韩av电影在线观看| 中国女人一级毛片| 99re在线视频这里只有精品| 欧美日韩黄色一级片| av片在线观看网站| 国产一区二区女内射| 国产日韩欧美| 亚洲精品在线视频观看| 欧美变态视频| 欧美最猛黑人xxxxx猛交| 内射一区二区三区| 欧美一级本道电影免费专区| 91久久在线观看| 最近免费看av| 亚洲高清一区二区三区| 99久久久无码国产精品衣服| 青青久久av| 国产一区玩具在线观看| 白丝美女让我捅| 亚洲一区二区三区中文字幕在线| 亚洲国产精品无码久久久久高潮 | 韩国中文字幕hd久久精品| 美国欧美日韩国产在线播放| 日本黄色片一级片| 91亚洲天堂| 在线成人一区二区| 深爱五月激情五月| 不卡免费追剧大全电视剧网站| 国产三级三级三级看三级| 性欧美18xxxhd| 国产欧美一区二区三区鸳鸯浴| 久久人妻精品白浆国产| 91久久国产综合久久91猫猫| 久热精品在线视频| 欧美日韩不卡中文字幕在线| 久久久午夜精品理论片中文字幕| 亚洲va在线va天堂va偷拍| 精品自拍视频| 国产精品男女猛烈高潮激情| 免费99热在线观看| 欧美在线一区二区| 无码人妻精品一区二区三区蜜桃91| 新狼窝色av性久久久久久| av网站大全免费| 亚洲wwww| 国产成人avxxxxx在线看 | 欧美资源在线| 九九九九免费视频| 欧美大片1688网站| 国产91免费观看| 色偷偷亚洲女人天堂观看欧| 欧美性猛片aaaaaaa做受| 中文字幕在线播| 成人在线免费观看av| 四虎成人精品一区二区免费网站| 国产精品男人的天堂| 中文字幕第5页| 欧美tk丨vk视频| 蜜臀久久精品久久久久| 久久伊人中文字幕| 国产在线观看无码免费视频| 成人久久综合| 伊人天天久久大香线蕉av色| 欧美78videosex性欧美| 欧美极品在线播放| www.天天操| 日韩欧美国产综合在线一区二区三区 | 日韩电影中文字幕| 中文字字幕一区二区三区四区五区| 国产精品美女一区二区三区| 一二三四在线观看视频| 一本色道精品久久一区二区三区 | 激情文学综合| 91精品午夜视频| 天天色棕合合合合合合合| 亚洲丝袜自拍清纯另类| 久久久久无码国产精品| 久久爱www久久做| 污污免费在线观看| 欧美激情成人在线|