-c選項表示編譯、匯編指定的源文件(也就是編譯源文件),但是不進行鏈接。使用-c選項可以將每一個源文件編譯成對應的目標文件。
目標文件是一種中間文件或者臨時文件,如果不設置該選項,gcc 一般不會保留目標文件,可執行文件生成完成后就自動刪除了。
注意,使用-c選項表示只編譯源文件,而不進行鏈接,因此,對於鏈接中的錯誤是無法發現的。
下面例子演示了 gcc 編譯器在使用-c選項的時候不會發現鏈接錯誤。
1) 編寫如下的兩個源文件。
在 func.c 中定義了 func_a() 函數:
#include <stdio.h>
void func_a(){
printf("FUNC_A\n");
}
在 main.c 中調用了 func_a() 和 func_b() 函數:
#include <stdio.h>
int main(void)
{
func_a();
func_b();
return 0;
}
func_b() 函數並沒有定義,所以在鏈接時會產生錯誤(編譯時不會產生錯誤)。
2) 使用-c選項編譯兩個源文件,如下所示:
$gcc -c func.c main.c
編譯器沒有輸出任何錯誤信息。
3) 不使用-c選項編譯兩個源文件:
$gcc func.c main.c
會看到如下的報錯信息:
/tmp/ccLlOhvh.o:在函數‘main’中: main.c:(.text+0x14):對‘func_b’未定義的引用 collect2: 錯誤:ld 返回 1
由於沒有找到 func_b() 函數的定義,所以發生了鏈接錯誤。
