關於linux gcc的動態鏈結和函式同名情況

2021-10-06 15:27:44 字數 2095 閱讀 7281

-i(大寫i,include):指定include標頭檔案的位置

-l (小寫l,link):指定link庫檔案的名字,如庫檔案libhello.so,那麼加入引數-lhello

-l:指定找庫檔案的位置

例子:

gcc test7.c -o test7 -i /usr/src/linux-source-4.15.0/linux-source-4.15.0/tools/include

去/usr/src/linux-source-4.15.0/linux-source-4.15.0/tools/include找標頭檔案

乙個困擾我的問題是,我們在.c檔案中include了乙個標頭檔案,標頭檔案中有對某個函式的宣告,那麼gcc是如何找到對應函式的定義,然後鏈結生成可執行檔案的呢??

#ifndef hello_h_

#define hello_h_

#include

intshow

(void);

#endif

定義函式定義檔案hello.c:

#include

void

show

(void

)

定義main入口main.c:

#include

"hello.h"

intmain()

生成.so檔案:

gcc -shared -fpic hello.c -o libhello.so
生成可執行檔案:

gcc main.c -o main -l /home/txz/documents/module_learn/test6 -lhello
因此,在編譯生成可執行檔案的時候就指定了動態鏈結庫的位置,所以這樣在執行的時候就知道去哪找了;

情況1:

#include

"hello.h"

//動態鏈結了另乙個show

intshow

(void

)int

main()

編譯:

gcc main.c -o main -l ./ -lhello
是可以通過的,無報錯,無警告,並且結果列印的在主函式中定義的內容

情況2

在main函式中定義了和c標準庫函式同名的函式:

// main.c

#include

intprintf

(void

)int

main()

編譯報錯:

main.c:3:5: error: conflicting types for 『printf』

int printf(void)

{ ^~~~~~

in file included from main.c:2:0:

/usr/include/stdio.h:318:12: note: previous declaration of 『printf』 was here

extern int printf

(const char *__restrict __format, ...)

; ^~~~~~

main.c: in function 『main』:

main.c:7:5: error: too many arguments to function 『printf』

printf(

"hello\n");

^~~~~~

main.c:3:5: note: declared here

int printf(void)

{ ^~~~~~

出現conflict,因為c庫函式是built-in內建函式,和尋常自定義的函式不一樣;使用和c庫函式同名的函式必會conflict;

情況3:

Linux GCC編譯使用動態 靜態鏈結庫

在windows下動態鏈結庫是以.dll字尾的檔案,二在linux中,是以.so作字尾的檔案。動態鏈結庫的好處就是節省記憶體空間。1 linux下建立動態鏈結庫 在使用gcc編譯程式時,只需加上 shared選項即可,這樣生成的執行程式即為動態鏈結庫。例如有檔案 hello.c x.h main.c...

linux gcc鏈結選項詳解

i 大寫i l 大寫l l 小寫l 1 l i 大寫i 顯示指定標頭檔案的搜尋路徑。i home myinclude 表示 home myinclude目錄作為第乙個尋找標頭檔案的目錄,尋找的順序是 home myinclude usr include usr local include 2 l 大...

Linux gcc 製作動 靜態鏈結庫

以 math.c為例 gcc c math.c ar rcs libmath.a math.oar命令 將多個檔案打包成乙個備份檔案 引數r 用來替換庫中已有的目標檔案,或加入新的目標檔案 引數c 表示建立乙個庫,不管庫是否存在,都將建立 引數s 用來建立目標檔案的索引,這在建立較大的庫時能夠提高速...