亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 電腦知識 > 正文

linux下c程序的鏈接、裝載和庫(2)

2024-05-08 15:56:05
字體:
來源:轉載
供稿:網友

5. 重定義錯誤。

    一個最終的可執行文件里,絕對不允許出現兩個同名的全局變量,也不允許出現同名的全局函數。

    全局函數:只要不用 static 修飾符修飾的函數,全部都是全局的。

    全局變量:函數外聲明定義,且不加 static 修飾符修飾的變量。

    例如,one.c 里有一個函數 function, 那么你如果想讓 main.c 生成的 main.o 能夠鏈接 one.o 的話,那么 main.c 里就不能再有一個函數叫做 function 了。否則就會報重定義錯誤。

    這就好像,你的班上有兩個人都叫 小明, 這個情況確實麻煩,你肯定會用各種辦法區分他們,比如說,大小明,小小明,這種方法,實際上,你已經為他們重新命名了。

6. 聲明和定義。

    你也許發現了一個問題,那就是:main.c 里 有一句

    extern void function();

    這一句不是跟 one.c 里的 function 重名了么。那么編譯器為啥不報錯呢?

    想一想整個過程。

    第一步:

    gcc -c main.c -o main.o

    這一步就是編譯 main.c 的過程,好吧,這一步,編譯器完全不用關心在某個地方還有個 one.c,這個源文件里有一個同名的function。

    仔細解釋一下這句話:

    extern void function();

    你寫程序的時候,要有一種跟編譯器時刻交流的感覺。

    這一句是你寫給編譯器看的,你就是要告訴編譯器這樣一個事實:

    --Hey!編譯器!

    --main.c 這個源文件里要用到一個函數 function,是void 類型的,沒有參數,你暫時不用管這個函數到底在哪,你先編譯通過,這個函數最終會被你的哥們鏈接器鏈接過來!

    編譯器:

    --ok!我相信我的哥們鏈接器!

    這個過程就叫做“聲明”。如果沒有這一句,沒有這個過程,編譯器就會在 main.c 里遇見一個陌生的函數調用 function,嗯,結果就是,?。?/p>

    而這個函數 function 的真正定義就是在 one.c 里。所謂定義,就是具體的實現,就是這個函數大括號里的東西。也可以這么說,沒有大括號(即使沒有 extern 修飾符)的地方就是聲明,有大括號(即使大括號里是空的)的地方,那就是定義。

    還有一句,聲明可以多次,比如說,每一個用到了函數 function 的地方,都要聲明(你可以不用 extern 這個修飾符,試試吧)。但是,定義只有一個,這也符合上一小節說的:不能重定義!

7. 從硬盤到內存--裝載。

    這一節不準備總結的太細。

    你寫好的源文件是放在硬盤上的,你編譯成的目標文件也是放在硬盤上的,鏈接成的可執行文件也是放在硬盤上的。

    當你,運行這個可執行文件的時候,操作系統就會做一件事情:裝載。

    可以簡單粗暴的假想,操作系統把你的可執行文件直接復制到內存的某個地方,然后,cpu開始在這個地方去找 main 函數,進而執行整個程序。

    所以你的程序才會占內存的空間:變量會占,函數會占,動態開辟(例如malloc)的更會占。

8. 節省一點內存。

    你的同事十分能干,他用他閑暇的時間,積極地擴充他所維護的 one.c,使這個 one.c 更加豐富。比如說,他增加了一個函數

    int add(int a, int b)

    {

         //省略代碼

    }

    可是,你知道,函數最終是要占內存空間的。并且,你完全用不到這個新加的函數 add。

    問題就是,你鏈接的時候,已經把整個 one.o 鏈接到你的 可執行文件里了。這個可執行文件確實包含了 add 的具體實現的代碼,也就是說,最終運行的時候,內存里確實會有這一部分,而且是完全沒用的部分。

    你僅僅用到了 one.o 里的一個函數 function 就要鏈接整個 one.o,這就好像,你到飯店,只想吃一個漢堡,卻不得不花錢買一份套餐,浪費。

    你不得不跟你的同事說明一下這個問題,最終你們商量出了一個辦法。

    你的同事決定,將他寫的每一個函數單獨放到一個源文件里去,比如說,function函數放到 function.c ,add函數放到 add.c。

    這樣,一個函數對應一個源文件,也對應一個目標文件,也就是說,一個目標文件里只有一個函數,沒有其他的東西。

    你使用的時候,就能夠隨便挑選,去鏈接哪個目標文件了。

    比如說,你的同事已經有了這些:

    one.c 包含了 void one(){} 函數

    two.c 包含了 void two(){} 函數

    three.c 包含了 void three(){} 函數

    等等……。而且也提供了一份頭文件叫做 all.h, 這個all.h包含了所有他編寫的函數的聲明。

    你使用的時候先包含這個all.h, 像這樣

    #include "all.h"

    然后,編譯;然后鏈接的時候,你用到了哪個,就在你的gcc命令里加上那個目標文件就行。例如,用到了 void three() 這個函數:

    ld main.o three.o -o go

    這樣就行了。

    但是即便是這樣, 你還是覺得麻煩,你得在心里記錄一下,你用了哪些函數,并且去手動敲下命令進而鏈接,這樣容易出錯。

    任何問題都是有可能解決的,這次也不例外。

    


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人激情在线观看| 欧美成人国产va精品日本一级| 国产精品99久久99久久久二8| 亚洲国产精品久久91精品| 欧美精品在线视频观看| 成人免费自拍视频| 中文字幕欧美精品在线| 色偷偷偷亚洲综合网另类| 美女精品视频一区| 精品国产精品自拍| 国产午夜精品一区理论片飘花| 91黄色8090| 亚洲精品久久久久| 中文字幕在线成人| 欧美精品久久久久a| 日韩福利伦理影院免费| 一区二区欧美在线| 欧美激情在线观看| 88国产精品欧美一区二区三区| 色偷偷偷亚洲综合网另类| 亚洲影院高清在线| 亚洲va久久久噜噜噜久久天堂| 亚洲已满18点击进入在线看片| 日韩网站免费观看高清| 91亚洲国产成人久久精品网站| 亚洲跨种族黑人xxx| 5252色成人免费视频| 午夜免费在线观看精品视频| 国产午夜精品美女视频明星a级| 欧美激情中文字幕乱码免费| 日韩美女写真福利在线观看| 国产亚洲精品久久久久久| 欧洲成人免费aa| 欧美亚洲成人免费| 国产精品久久视频| 中文字幕九色91在线| 欧美极品少妇xxxxⅹ免费视频| 亚洲电影免费观看高清| 亚洲精品福利在线观看| 亚洲综合中文字幕在线观看| 久久精品国产久精国产一老狼| 欧美成人精品一区二区| 97**国产露脸精品国产| 日韩最新在线视频| 成人免费看黄网站| 欧美激情国产高清| 国产美女直播视频一区| 欧美老肥婆性猛交视频| 久久青草福利网站| 欧美日本黄视频| 国产精品视频在线播放| 成人乱人伦精品视频在线观看| 欧美久久精品一级黑人c片| 日韩精品高清视频| 久久国产精品久久国产精品| 亚洲精品久久久久久下一站| 91精品国产综合久久久久久蜜臀| 高清视频欧美一级| 午夜欧美大片免费观看| 久久av在线播放| 亚洲成人xxx| 国产成人一区二| 操人视频在线观看欧美| 国产日韩欧美夫妻视频在线观看| 国内精品模特av私拍在线观看| 亚洲一区二区免费| 国产精品天天狠天天看| 国产精品国产福利国产秒拍| 日韩美女免费视频| 国产精品免费看久久久香蕉| 国产精品一区二区三区成人| 色噜噜狠狠狠综合曰曰曰88av| 国产精品视频成人| 欧美小视频在线观看| 欧美性猛交丰臀xxxxx网站| 亚洲第一页自拍| 57pao国产成人免费| 岛国av一区二区三区| 欧美激情视频一区二区三区不卡| 国产成人拍精品视频午夜网站| 国产精品欧美一区二区三区奶水| 亚洲人成伊人成综合网久久久| 精品无人区太爽高潮在线播放| 国产精品视频一区二区高潮| 国产午夜精品免费一区二区三区| 欧美特黄级在线| 久久久久久999| 国产成人亚洲综合青青| 国内精品久久久久久久久| 91免费看片网站| 亚洲精品一区二区三区不| 久久九九国产精品怡红院| 欧美自拍大量在线观看| 亚洲精品一区二区三区婷婷月| 久久久国产一区二区三区| 国产精品视频久久久| 亚洲一区二区免费在线| 亚洲国产小视频| 亚洲电影在线看| 秋霞av国产精品一区| 亚洲国产成人精品女人久久久| 日韩中文字幕精品| 国产精品久久久久久久美男| 色妞久久福利网| 国产成人综合精品在线| 日日狠狠久久偷偷四色综合免费| 中文字幕视频在线免费欧美日韩综合在线看| 久久免费福利视频| 久久久电影免费观看完整版| 国产精品777| 欧美性视频网站| 亚洲欧美一区二区三区在线| 亚洲第一区中文字幕| 欧美日韩激情视频| 亚洲最新视频在线| 91欧美精品成人综合在线观看| 一区二区三区四区在线观看视频| 尤物精品国产第一福利三区| 日韩黄色av网站| 欧美中文字幕视频在线观看| 成人av在线网址| 国产精品中文字幕在线观看| 国产精品国产三级国产aⅴ9色| 国产丝袜精品视频| 日韩美女毛茸茸| 97久久久久久| 黑人巨大精品欧美一区二区| 欧美在线视频观看免费网站| 国产精品中文字幕在线观看| 欧美成人免费小视频| 亚洲码在线观看| 欧美午夜影院在线视频| 亚洲精品免费网站| 国产精品丝袜白浆摸在线| 亚洲精品成人久久| 精品久久香蕉国产线看观看gif| 国产精品88a∨| 亚洲男人的天堂网站| 日韩乱码在线视频| 热re99久久精品国产66热| 亚洲偷熟乱区亚洲香蕉av| 欧美日韩加勒比精品一区| 中日韩美女免费视频网站在线观看| 高清在线视频日韩欧美| 另类图片亚洲另类| 国产日韩精品一区二区| 国产精品久久久久久av| 国产亚洲一区二区精品| 亚洲美女精品成人在线视频| 午夜精品一区二区三区在线| 中文字幕欧美日韩va免费视频| 亚洲a中文字幕| 成人国产亚洲精品a区天堂华泰| 亚洲精品有码在线| 精品国产成人在线| 在线视频中文亚洲| 亚洲成人三级在线| 国产www精品| 57pao精品| 国产精品视频精品视频| 国产欧美一区二区三区视频| 91爱视频在线| 精品中文字幕视频| 亚洲欧美综合区自拍另类|