-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 用來建立目標檔案的索引,這在建立較大的庫時能夠提高速...