源文件在不同目錄下用gcc編譯多個.h .c 文件


gcc 與 g++ 分別是 gnu 的 c & c++ 編譯器 gcc/g++ 在執行編譯工作的時候,總共需要4步:

  1. 預處理,生成 .i 的文件
  2. 將預處理后的文件轉換成匯編語言, 生成文件 .s
  3. 有匯編變為目標代碼(機器代碼)生成 .o 的文件
  4. 連接目標代碼,生成可執行程序

參數詳解

-c

只激活預處理,編譯,和匯編,也就是他只把程序做成obj文件

例子用法:

gcc -c hello.c 

他將生成 hello.o 的 obj 文件

-S

只激活預處理和編譯,就是指把文件編譯成為匯編代碼。

例子用法:

gcc -S hello.c 

他將生成 .s 的匯編代碼,你可以用文本編輯器察看。

-E

只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里面。

例子用法:

gcc -E hello.c > pianoapan.txt 
gcc -E hello.c | more 

慢慢看吧,一個 hello word 也要與處理成800行的代碼。

-o

制定目標名稱,默認的時候,gcc 編譯出來的文件是 a.out。

例子用法:

gcc -o hello hello.c         // 生成名為hello的.out可執行文件
gcc -o hello.asm -S hello.c  // 生成名為hello.asm的匯編代碼

-l

提示編譯器尋找頭文件的目錄或路徑,當頭文件在另一個目錄下時可以使用 -I 來手動添加

使用gcc編譯多個.h .c 文件

.h.c文件在同一個目錄下

1.c

#include <stdio.h>
#include "my_head.h"

int main(int argc, char *argv[]){
    print();
    return 0;
}

2.c

#include <stdio.h>
#include "my_head.h"

void print(){
    printf("Hello world!\n");
}

my_head.h

#ifndef myhead_h
#define myhead_h
void  print();
#endif

image-20210223141221297

假如他們都在一個目錄下面,那么編譯流程:

gcc -c 2.c             // 只激活預處理,編譯,和匯編生成2.o文件
gcc -o main 1.c 2.o    // 連接目標代碼,生成可執行程序main

image-20210223141359903

.h.c文件在不同的目錄下

在稍微大一點的項目里面,一般都會包含多個文件。尤其是包含多個頭文件,各自頭文件的實現,和包含main函數的文件。這樣的好處就是更容易開發和維護。

舉一個簡單的例子,main.cpp 文件是包含main函數的文件,在myinclude的文件下,包含了myhead.h 和 myhead.cpp 文件。分別是頭文件的定義和實現。

image-20210223142448475

下面開始編譯:
假如在當前目錄直接編譯的話:

image-20210223142748473

直接編譯的結果就是報錯了,錯誤的原因是 默認的include目錄下面沒有 myhead.h 頭文件。

可以通過 -I 選項 鏈接上去。重新編譯。

image-20210223142916187仍然有報錯,錯誤的原因是頭文件雖然找到了,但是沒有定義print函數。print函數是在2.c文件內定義的。也就是需要把2.c文件編譯一下。

image-20210223143111283

最后,再一次的編譯:

image-20210223143449121


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM