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

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

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

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

  讀完《程序員的自我修養--鏈接、裝載和庫》相關章節,想來總結一下,若有錯誤,請指正,多謝。

1. 什么叫目標文件?

    你的工程里有很多xxx.c這樣的源文件,這些文件是文本文件,只有人能夠認識(當然編譯器認識),但是,cpu可不認識。問題就是,真正執行指令的是cpu。

    讓編譯器翻譯一下(這里面有很多過程,這不是這篇文章的重點),一般來說,一個xxx.c文件就能翻譯成一個xxx.o,這就是目標文件了。

    一個源文件就對應一個目標文件,這個目標文件就存儲了有關這個源文件的所有信息了,包括在這個源文件里函數的定義,全局變量的定義,等等。

    但是,這樣就可以毫無憂慮地執行這個目標文件了么?   不可以。

    一, 你這個目標文件可能沒有main函數;

    二, 你這個目標文件里,可能用到了其他函數,而這些函數的定義是在其他目標文件里的。比如說,main.c 用到了 one.c 里的 void function(); 你去執行main.c 生成的main.o,肯定不行啊,因為cpu都找不到function在哪,從而function里存儲的指令,當然也沒法執行;

    總之,你要運行的那個文件,里面必須得存有一切函數和變量的相關信息才可以。很顯然,目標文件不具有這個特性。因為,目標文件只存儲了自己的信息,并不知道其他目標文件的信息。

2. 目標文件的拼接-->可執行文件

    好的,你有一個main.c 和 一個 one.c, 并且成功的生成了兩個目標文件,各自存儲了自身的信息,它們就是 main.o 和 one.o。

    不巧的是,main.c 里用到了 one.c 里的 void function(); 函數。這個時候,main.o 苦于找不到這個函數在哪而不得執行。而 one.o 靜靜的等在那,等待一個過程。

    這個過程就是鏈接。 

    ld 是一個指令,linux 下,可以讓目標文件鏈接起來,拼成一個真正能用的可執行文件。

    例如這樣:

    ld main.o one.o -o go

    其中 -o 后面是隨意指定的,這就是可執行文件的名稱。好了,這個 go 就是最終的可執行文件。你可以去執行它了。

    go 是由兩個目標文件拼起來的,它當然知道所有的信息,包括 具體的 function 的指令。于是,它就可以被執行。

    現在,到了這里,我們似乎忘了另一種重要的文件,頭文件。

3. 頭文件是個啥?

    好吧,問題能提升你看這篇文章的樂趣。那就思考一個問題:main.c 能成功編譯成 main.o么?

    剛才的過程似乎太順利,main.c 刷一下就成了 main.o, 而問題是,你在 main.c 里使用了一個它不認得的函數 void function(); 這個竟然能編譯過,順利生成 main.o?

    你可以試試,用這樣的命令:

    gcc -c main.c -o main.o

    -c 選項就是說,我要生成目標文件,而不是默認的可執行文件。你一定會得到一個【編譯】錯誤,這個錯誤會告訴你,function 這個函數我不認識,敗!

    【編譯】錯誤,在源頭上先防止你造出一個完全不能用的程序。

    這個時候,怎么辦,main.c 確實不認得 function 函數,你總不能把 one.c 里的函數復制粘貼到 main.c 里吧(當然這是可以的,不過,low爆了)。

    那么需求如下:

    一, 不拷貝過來整個函數;

    二, 讓 main.c 順利生成 main.o。

    問題的核心就是,讓 main.c 認識 function 是個啥(是函數還是變量?如果是函數,這個函數的參數有哪些?返回什么類型的值?)。

    容易,你在 main.c 源文件里加一句 

    extern void function(); // 這個函數的返回類型是 void, 并且沒有參數。

    這樣一來,main.c 本身就認識了 function, 注意,只是認識,但是并不知道它具體實現,也不知道這個函數在哪里。實際上,也不需要知道這么多。因為,我這一步只是生成目標文件而已。剩下的交給鏈接那一步。

    結論,生成目標文件,必須得讓源文件認識每一個符號(變量和函數)。

    假如 one.c 是你的同事編寫的,你應該讓他同時編寫一個頭文件。省的你還要在你的 main.c 里 一行行地加上 

    extern void function1();

    extern int function2(char a);

    ...

    ...

    這種東西。

    你的同事會給你一個頭文件 one.h , 這個頭文件里實際上就是以上extern的內容。你只需要在 main.c 里這樣干:

    #include "one.h"

    就行了,這一句就是把 one.h 整個拷貝到 main.c 里去。

4. PRintf 用起來挺爽的。

    printf 用起來挺爽的。

    你只用寫上

    #include <stdio.h>

    讓你的 main.c 認識這個函數就能用了。

    不過,問題是,你并沒有鏈接 printf 所在的目標文件?。?/p>

    思考,思考,再思考!

    好吧,這不是個問題。

    實際就是,gcc 默認幫你鏈接了。千萬不要認為,不用鏈接就可以?。。。?/p>

    你可以這么認為:只要是系統提供的東西,你都不用手動鏈接,你關心好自己的東西就行了。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久国产精品视频| 91国产视频在线播放| 国产在线一区二区三区| 国产精品第一视频| 久久久免费在线观看| 亚洲国产成人精品电影| 精品久久久久国产| 欧美日韩国产区| 91极品女神在线| 欧美日韩国产成人在线观看| 亚洲少妇激情视频| 欧美一区深夜视频| 国产亚洲成av人片在线观看桃| 91tv亚洲精品香蕉国产一区7ujn| 亚洲精品免费网站| 日韩精品欧美激情| 国产精品69久久久久| 久久乐国产精品| 成人黄色中文字幕| 国产精品久在线观看| 国产精品露脸av在线| 亚洲国内精品在线| 久久国产一区二区三区| 日韩欧美在线视频日韩欧美在线视频| 欧美成aaa人片在线观看蜜臀| 97视频免费观看| 国产精品欧美在线| 亚洲成人动漫在线播放| 搡老女人一区二区三区视频tv| 欧美日韩精品在线播放| 欧美资源在线观看| 欧美黑人性生活视频| 日韩av不卡电影| 国产免费成人av| 热re99久久精品国产66热| 久久精品久久精品亚洲人| 久久国产精品亚洲| 性欧美视频videos6一9| 国产+成+人+亚洲欧洲| 亚洲精品456在线播放狼人| 欧美在线日韩在线| 精品中文视频在线| 97高清免费视频| 亚洲国产精彩中文乱码av在线播放| 欧美精品情趣视频| 91社区国产高清| 久久久久女教师免费一区| 国产精彩精品视频| 中文字幕在线日韩| 日韩在线视频观看正片免费网站| 国产精品福利网站| 奇米4444一区二区三区| 国产日韩在线免费| 日韩精品视频在线观看网址| 久久精品视频网站| 97色在线观看| 北条麻妃99精品青青久久| 欧美成人激情图片网| 欧美激情二区三区| 国产亚洲成精品久久| 精品爽片免费看久久| 精品久久久久久电影| 91麻豆国产语对白在线观看| 亚洲激情视频在线| 永久555www成人免费| 久久久久亚洲精品国产| 成人av.网址在线网站| 日韩久久免费视频| 欧美精品videosex极品1| 亚洲国产高清福利视频| 91精品国产九九九久久久亚洲| 国产亚洲欧美aaaa| 国产精品久久久久免费a∨| 性欧美长视频免费观看不卡| 日本精品性网站在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲精品国产精品乱码不99按摩| 欧美国产第一页| 九九热精品视频在线播放| 精品中文字幕在线2019| 国产女精品视频网站免费| 国产亚洲欧美另类中文| 日本不卡高字幕在线2019| 国产精品亚洲аv天堂网| 黄色精品一区二区| 日韩有码视频在线| 中文字幕日韩有码| 欧美午夜片欧美片在线观看| 久热国产精品视频| 日韩专区在线播放| 韩国精品美女www爽爽爽视频| 亚洲欧美中文日韩v在线观看| 亚洲精品乱码久久久久久按摩观| 91美女高潮出水| 久久中文字幕视频| 国产一区二区三区日韩欧美| 欧美极品xxxx| 中文字幕亚洲一区| 欧美性猛交xxxx富婆弯腰| 国产精品嫩草影院一区二区| 亚洲bt天天射| 亚洲一区二区久久久久久久| 国产精品日日做人人爱| 亚洲摸下面视频| 在线观看不卡av| 亚洲第一av网| 日韩大陆欧美高清视频区| www.日韩av.com| 成人乱人伦精品视频在线观看| 欧美日韩在线视频首页| 欧美激情中文字幕乱码免费| 亚洲精品久久久久久久久久久久久| 亚洲激情中文字幕| 97婷婷涩涩精品一区| 欧美电影院免费观看| 91久久精品国产| 亚洲国产精品高清久久久| 日韩精品在线免费观看视频| 日本欧美国产在线| 成人黄色免费片| 精品国产电影一区| 日本精品性网站在线观看| 欧美日韩国内自拍| 91在线视频导航| 欧美老女人性生活| 91av免费观看91av精品在线| 亚洲嫩模很污视频| 国产精品电影网站| 亚洲电影成人av99爱色| 一区二区成人精品| 九九热99久久久国产盗摄| 日韩在线观看高清| 亚洲电影免费观看高清| 国产精品爽爽ⅴa在线观看| 国产专区精品视频| 亚洲日本欧美中文幕| 91中文字幕一区| 粉嫩老牛aⅴ一区二区三区| 国产精品免费看久久久香蕉| 欧美激情第99页| 亚洲人成电影网| 日本精品在线视频| 久久深夜福利免费观看| 中文字幕av日韩| 深夜成人在线观看| 久久精品国产96久久久香蕉| 欧美精品videos另类日本| 国产亚洲欧美日韩精品| 欧美精品在线看| 国产精品成人一区二区三区吃奶| 91精品国产高清久久久久久久久| 色偷偷88888欧美精品久久久| 亚洲九九九在线观看| 日韩精品免费在线| 九九九热精品免费视频观看网站| 97国产一区二区精品久久呦| 2021国产精品视频| 综合激情国产一区| 日韩大陆欧美高清视频区| 性夜试看影院91社区| 欧美多人乱p欧美4p久久| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲男人天堂九九视频| 88国产精品欧美一区二区三区|