.h 檔案中宣告的方法和一些結構體等,同一專案下的其他c檔案可以直接呼叫。
但是.**件中的方法並未實現,所以需要有乙個c檔案在引用這個.**件後來實現。
這個c檔案實現後,其他c檔案再引用.**件的方法後,這個方法也就是被實現的狀態了。
假如 有main.c,t1.c, ttt.h
#ttt.h
#include
void
test()
;
#t1.c
#include
#include
"ttt.h"
#實現test方法
void
test()
#main.c
#include
#include
"ttt.h"
intmain()
在控制台輸入
gcc main.c t1.c -o main.exe
然後在輸入
.
/main.exe
即可得到"this is a test for .h"字串。
gcc -c main.c t1.c
會得到main.c t1.c的目標檔案:main.o和t1.o
也可以寫成gcc main.c t1.c
或者gcc main.c -c t1.c
或者gcc t1.c -c main.c
gcc -o main.exe main.o t1.o
-o後的第一引數是指定輸出的可執行程式的名稱
後邊的引數就是指定由哪些可執行檔案(.o檔案)去生成main.exe
也可以將輸入檔案寫在前面:
gcc main.o t1.o -o main.exe
(此時若不指定輸出檔案的名稱,即 gcc main.o t1.o 則會自動命名為a.exe)
或者這樣寫
gcc main.o -o main.exe t1.o
而gcc main.c t1.c -o main.exe
會直接生成main.exe。
gcc main.c t1.c
會生成a.exe
這兩個命令都不會產生.o檔案。
放在/lib和/usr/lib和/usr/local/lib裡的庫直接用-l引數就能鏈結了,假如/lib下有乙個libm.so的動態庫,那麼就可以寫成-lm,即去掉前面的lib和後邊的.so。
-l 優先鏈結動態庫,即.so結尾的;如果想鏈結靜態庫(即.a結尾),那就需要顯式的寫出來,即llibm.a。
如果庫並沒有放在這三個路徑下,就需要再使用 -l額外新增庫所在的路徑。 假如有乙個libtest.so在/home/aaa/ 下,那麼就需要這樣寫-l /home/aaa/ -ltest
上邊的l是小寫l,下邊i的是大寫i
而-i是用來告訴gcc .**件所在的目錄,當然如果是和原始碼在同一級目錄,此時就不需要顯式地告訴gcc。 就像在一中的例子裡,ttt.h 和 t1.c main.c 都在同一級目錄下,gcc可以自動找到ttt.h,所以在二中並沒有顯式指出ttt.h的位置。
但是如果ttt.h的路徑如果是 ./include/ttt.h,而此時的gcc過程中我們處於./ 目錄下,
此時就會報錯,找不到ttt.h。 那麼 就需要這樣寫:
gcc -i .
/include main.c t1.c -o main.exe
四:靜態庫和原始碼
.c 編譯生成.o後,而靜態庫其實就是將乙個或多個.o檔案打包在一起。
vs Code配置C 執行和除錯環境以及相關問題
按下 win r,輸入cmd,回車鍵之後輸入g 再回車,如果提示以下資訊 1 則環境變數配置成功。如果提示以下資訊 2 則環境變數配置失敗。1 g fatal error no input files 2 g 不是內部或外部命令,也不是可執行的程式或批處理檔案。o exe 編譯命令引數 proble...
h和 c檔案解析
簡單的說其實要理解c檔案與標頭檔案 即.h 有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程 1.預處理階段 2.詞法與語法分析階段 3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟cpu相關的二進位製碼,生成各個目標檔案 obj檔案 4.連線階段,編譯器在編譯時是 ...
h檔案和 c檔案
1 h標頭檔案 h檔案中一般是宣告,包括 變數宣告 巨集定義 列舉宣告 結構體宣告 函式宣告等。h標頭檔案是對該模組 c檔案 介面的宣告,介面包括該模組提供給其他模組呼叫的外部函式以及外部全域性變數。其他模組訪問這些外部定義的變數和函式都需要在.h檔案中冠以extern關鍵字宣告 模組 c檔案 內的...