UNIX 下是 .o 文件,即 Object File,這個動做叫作編譯(compile)。而後再把大量Object File 合成執行文件,這個動做叫做連接(link)。linux
通常來講,每一個源文件都應該對應於一箇中間目標文件(O 文件或是 OBJ 文件)。連接時,主要是連接函數和全局變量,因此,咱們可使用這些中間目標文件(O 文件或是OBJ文件)來連接咱們的應用程序。連接器並無論函數所在的源文件,只管函數的中間目標文件(Object File)。shell
咱們要給中間目標文件打個包,在 Windows 下這種包叫「庫文件」(Library File),也就是.lib 文件,在 UNIX下,是 Archive File,也就是 .a 文件。bash
總結一下,源文件首先會生成中間目標文件,再由中間目標文件生成執行文件。在編譯時,編譯器只檢測程序語法,和函數、變量是否被聲明。若是函數未被聲明,編譯器會給出一個警告,但能夠生成 Object File。而在連接程序時,連接器會在全部的 Object File 中找尋函數的實現,若是找不到,那到就會報連接錯誤碼(Linker Error),意思說是說,連接器未能找到函數的實現。你須要指定函數的Object File。函數
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.c
a.out hello.c main.c
複製代碼
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc -c main.c
main.o hello.c main.c
複製代碼
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.o
a.out
複製代碼
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc -o main.o
gcc: fatal error: no input files
compilation terminated.
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.o -o run
hello.c main.c main.o Makefile run
複製代碼
gcc main.c -o run
複製代碼
編譯main.c並連接生成可執行文件run,並將中間產生的目標文件main.o刪除。學習
使用ar命令將目標文件打包,不過通常這個動做都是在makefile中實現。 連接靜態庫參數說明,-L 表示靜態庫路徑,-lmy 即連接libmy.a文件ui
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# cat main.c
#include <stdio.h>
void main()
{
printf("Im a super man\n");
hello();
test();
}
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# ar rcs libmy.a test.o hello.o
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.c -L . -lmy -o run
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# ./run
Im a super man
hello world
test
複製代碼
參考資料:spa
linux ar 命令的使用說明和實例講解_linux shell_腳本之家 https://www.jb51.net/article/95627.htm.net
gcc 連接文件 - NeverWA的博客 - CSDN博客 https://blog.csdn.net/NeverWA/article/details/79948049code