Linux的動態(tài)庫文件是以lib字樣開頭的.so文件,編譯鏈接動態(tài)庫有兩個要點:一個是需要用-L選項指定動態(tài)庫的搜索路徑,這個搜索路徑是需要連接的so文件的大致路徑,比如/usr/openssl/lib;另外還需要用-l(這個是小寫的L)選項指定動態(tài)庫的名字,比如下面這條編譯命令:
創(chuàng)新互聯(lián)公司是一家專業(yè)提供洮北企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、成都做網(wǎng)站、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為洮北眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto
鏈接有問題是找不到庫文件 將庫的路徑加到/etc/ld.so.conf里面就行了 再ldconfig一下
1. 預(yù)處理
首先源代碼文件(.c/.cpp)和相關(guān)頭文件(.h/.hpp)被預(yù)處理器cpp預(yù)編譯成.i文件(C++為.ii)。預(yù)處理命令為:
gcc –E hello.c –o hello.i
預(yù)編譯過程主要處理那些源代碼中以#開始的預(yù)編譯指令,主要處理規(guī)則如下:
u 將所有的#define刪除,并且展開所有的宏定義;
u 處理所有條件編譯指令,如#if,#ifdef等;
u 處理#include預(yù)編譯指令,將被包含的文件插入到該預(yù)編譯指令的位置。該過程遞歸進(jìn)行,及被包含的文件可能還包含其他文件。
u 刪除所有的注釋//和 /**/;
u 添加行號和文件標(biāo)識,如#2 “hello.c” 2,以便于編譯時編譯器產(chǎn)生調(diào)試用的行號信息及用于編譯時產(chǎn)生編譯錯誤或警告時能夠顯示行號信息;
u 保留所有的#pragma編譯器指令,因為編譯器須要使用它們。
2. 編譯
編譯過程就是把預(yù)處理完的文件進(jìn)行一系列詞法分析,語法分析,語義分析及優(yōu)化后生成相應(yīng)的匯編代碼文件(.s)。編譯的命令為:
gcc –S hello.i –o hello.s
或者從源文件直接輸出匯編代碼文件:
gcc –S hello.c –o hello.s
現(xiàn)在版本的GCC把預(yù)編譯和編譯兩個步驟合并成一個步驟,由程序cc1來完成(C++為cc1plus)。
3. 匯編
匯編就是將匯編代碼轉(zhuǎn)變成機器可以執(zhí)行的命令,生成目標(biāo)文件(.o),匯編器as根據(jù)匯編指令和機器指令的對照表一一翻譯即可完成。匯編的命令為:
gcc –c hello.s –o hello.o
或者從源文件直接輸出目標(biāo)文件:
gcc –c hello.c –o hello.o
4. 鏈接
鏈接就是鏈接器ld將各個目標(biāo)文件組裝在一起,解決符號依賴,庫依賴關(guān)系,并生成可執(zhí)行文件。鏈接的命令為:
ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o
一般我們使用一條命令就可以完成上述4個步驟:
gcc hello.c
實際上gcc只是一些其它程序的包裝,它會根據(jù)不同參數(shù)去調(diào)用預(yù)編譯編譯程序cc1、匯編器as、鏈接器ld。
有以下步驟:
1.源程序的編譯
在Linux下面,如果要編譯一個C語言源程序,我們要使用GNU的gcc編譯器.
下面
我們以一個實例來說明如何使用gcc編譯器.
假設(shè)我們有下面一個非常簡單的源程序(hello.c):
int
main(int
argc,char
**argv)
{
printf("Hello
Linux\n");
}
要編譯這個程序,我們只要在命令行下執(zhí)行:
gcc
-o
hello
hello.c
gcc
編譯器就會為我們生成一個hello的可執(zhí)行文件.執(zhí)行./hello就可以看到程
序的輸出結(jié)果了.命令行中
gcc表示我們是用gcc來編譯我們的源程序,-o
選項表示
我們要求編譯器給我們輸出的可執(zhí)行文件名為hello
而hello.c是我們的源程序文件.
gcc編譯器有許多選項,一般來說我們只要知道其中的幾個就夠了.
-o選項我們
已經(jīng)知道了,表示我們要求輸出的可執(zhí)行文件名.
-c選項表示我們只要求編譯器輸出
目標(biāo)代碼,而不必要輸出可執(zhí)行文件.
-g選項表示我們要求編譯器在編譯的時候提
供我們以后對程序進(jìn)行調(diào)試的信息.
知道了這三個選項,我們就可以編譯我們自己所寫的簡單的源程序了,如果你
想要知道更多的選項,可以查看gcc的幫助文檔,那里有著許多對其它選項的詳細(xì)說
明.
2.Makefile的編寫
假設(shè)我們有下面這樣的一個程序,源代碼如下: