程序的編譯和連接原理分析

記錄下學習《跟我一塊兒寫makefile》這本書時整理的筆記。

1、原理說明

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。函數

2、簡單的編譯連接流程實例

  1. 產生可執行文件a.out,中間產生main.o的目標文件,但在連接成功後刪除。
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.c 
a.out  hello.c  main.c
複製代碼
  1. -c 參數意味着只編譯(compile) 產生main.o目標文件
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc -c main.c 
main.o  hello.c  main.c
複製代碼
  1. 連接文件,默認爲a.out
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.o
a.out
複製代碼
  1. -o name 使連接器保存可執行文件爲指定文件中,name爲指定文件名。
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
複製代碼
  1. 能夠結合起來使用
gcc main.c -o run
複製代碼

編譯main.c並連接生成可執行文件run,並將中間產生的目標文件main.o刪除。學習

3、目標文件打包與連接

使用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

相關文章
相關標籤/搜索