日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java程序員眼里的Gcc

作為一名 Java 程序員,對 gcc 的基本使用總是記不住,很不熟練,今天寫篇文章用最簡單的方式記錄下。

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),夏河企業(yè)網(wǎng)站建設(shè),夏河品牌網(wǎng)站建設(shè),網(wǎng)站定制,夏河網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,夏河網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

編譯的過程

寫個(gè) hello.c 代碼:

#include 
#define STR "hello world\n"

void main() {
printf(STR);
}

第一步:預(yù)處理(preprocess)

其實(shí)就是以下三個(gè)動作:

  • 頭文件展開
  • 宏定義直接替換
  • 條件編譯不成立就去掉
gcc -E hello.c -o hello.i

第二步:編譯(compile)

轉(zhuǎn)換成匯編語言:

gcc -S hello.i -o hello.s

第三步:匯編(assemble)

轉(zhuǎn)換成二進(jìn)制(ELF relocatable):

gcc -c hello.s -o hello.o

第四步:鏈接(link)

具體分為動態(tài)鏈接和靜態(tài)鏈接:

# 動態(tài)鏈接
gcc hello.o -o hello
# 靜態(tài)鏈接
gcc hello.o -o hello -static

靜態(tài)庫制作

寫一個(gè)加法函數(shù):

int add(int a, int b) {
return a+b;
}

編譯成 .o:

gcc -c add.c -o add.o

制作成靜態(tài)庫:

ar rcs libadd.a add.o

編寫測試代碼:

#include 
void main(){
printf("%d", add(1,2));
}

編譯成可執(zhí)行文件:

#寫法一
gcc test.c -o test libadd.a
#寫法二
gcc test.c -o test -static -ladd -L ./

執(zhí)行:

./test
3

動態(tài)庫制作

寫一個(gè)加法函數(shù):

int add(int a, int b) {
return a+b;
}

編譯成 .o:

gcc -c add.c -o add.o -fPIC

制作成動態(tài)庫:

gcc -shared -o libadd.so add.o

上面兩步也可以直接從源文件一步到位:

gcc -fPIC -shared -o libadd.so add.c

編寫測試代碼:

#include 
void main(){
printf("%d", add(1,2));
}

編譯成可執(zhí)行文件:

gcc test.c -o test -ladd -L ./

執(zhí)行發(fā)現(xiàn)報(bào)錯(cuò):

./test
error while loading shared libraries: libadd.so:
cannot open shared object file: No such file or directory

因?yàn)閳?zhí)行的時(shí)候找不到指定的動態(tài)庫。

那我們把 libadd.so 放在執(zhí)行時(shí)的動態(tài)庫默認(rèn)搜索路徑下,比如 /lib64:

cp libadd.so /lib64

再次執(zhí)行就成功了:

./test
3

查看二進(jìn)制文件的鏈接信息,也可以發(fā)現(xiàn)我們的 libadd.so 生效了:

ldd test
linux-vdso.so.1 => (0x00007ffe0f597000)
libadd.so => /lib64/libadd.so (0x00007fa5ab29f000)
libc.so.6 => /lib64/libc.so.6 (0x00007fa5aaed1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa5ab4a1000)

好了,以上就是編譯、靜態(tài)庫制作、動態(tài)庫制作的過程,先記住這些 gcc 的基本常識,再去研究原理吧!


當(dāng)前題目:Java程序員眼里的Gcc
標(biāo)題鏈接:http://www.dlmjj.cn/article/coddjii.html