gcc編譯h
在終端中輸入 gcc 文件名 -o 目標文件名
然後 ./目標文件名 就行了,沒有目標文件名,自動存為 a
執行 ./a 就行了。
在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。
-c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。
-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。
-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。
-O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。
-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶
A)#include <myinc.h>
B)#include 「myinc.h」
其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而B類,預處理程序在目標文件的文件夾內搜索相應文件。
GCC執行過程示例
示例代碼 a.c:
#include <stdio.h>
int main()
{
printf("hello\n");
}
預編譯過程:
這個過程處理宏定義和include,並做語法檢查。
可以看到預編譯後,代碼從5行擴展到了910行。
gcc -E a.c -o a.i
cat a.c | wc -l
5
cat a.i | wc -l
910
編譯過程:
這個階段,生成匯編代碼。
gcc -S a.i -o a.s
cat a.s | wc -l
59
匯編過程:
這個階段,生成目標代碼。
此過程生成ELF格式的目標代碼。
gcc -c a.s -o a.o
file a.o
a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
鏈接過程:
鏈接過程。生成可執行代碼。鏈接分為兩種,一種是靜態鏈接,另外一種是動態鏈接。使用靜態鏈接的好處是,依賴的動態鏈接庫較少,對動態鏈接庫的版本不會很敏感,具有較好的兼容性;缺點是生成的程序比較大。使用動態鏈接的好處是,生成的程序比較小,佔用較少的內存。
gcc a.o -o a
程序運行:
./a
hello
編輯本段
GCC編譯簡單例子
編寫如下代碼:
#include <stdio.h>
int main()
{
printf("hello,world!\n");
}
執行情況如下:
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.c -o hello
./hello
hello,world!
② 關於在linux下用gcc編譯頭文件的問題。
我用一個例子來告訴你怎麼樣在 C++ 里使用C的頭文件/函數。
比方說我有一個C的頭文件叫 c.h, C的源碼文件叫 c.c,內容分別是
c.h:
#ifndef _ASDFD_INCLUDED_
#define _ASDFD_INCLUDED_
#include <stdio.h>
extern int test(int a);
#endif
c.c:
#include "c.h"
int test(int a)
{
printf("A = %d\n", a);
return a*a;
}
現在我想在c++中使用c.c中提供的函數test(),我的c++文件名字叫 a.cpp,那麼裡面跟C有關的部分就要用 extern "C" {} 大括弧括起來,看看我的
a.cpp:
#include <iostream>
using namespace std;
extern "C"
{
#include "c.h"
}
int main()
{
int b = 12;
b = test(b);
cout<<"b = "<<b<<endl;
return 0;
}
看到了吧,#include "c.h" 被 extern "C" {}括起來了。
然後是如何編譯,先把C文件編出目標文件(.o)來
gcc -c c.c
你會看到生成了 c.o,其實,有目標文件就夠了,如果你一定要做成(靜態/動態)庫文件,也是可以的,不過我這里就不深入了,做成庫和直接用目標文件對解決你的問題沒有任何區別。
然後再編譯C++文件,也就是我的 a.cpp
g++ -o hello a.cpp c.o
看到了吧,我在編譯 a.cpp 的時候把C生成的 c.o也加上了。 然後生成 可執行的 hello, 運行
./hello
就可以看到
A = 12
b = 144
關於創建靜態庫,假定你有3個C文件, a.c, b.c, c.c 提供了你C++要用到的介面,那麼可以把這三個C文件編譯出來的目標文件放到一個庫文件里供C++使用,方法為
先編譯出目標文件
gcc -c a.c b.c c.c
這時候你應該看到有 a.o b.o c.o了
然後創建庫文件
ar cr libtest.a a.o b.o c.o
這三個目標文件就放入 libtest.a 這個靜態庫中了,然後編譯C++程序 (你的C++程序應該已經按照我前面說的用 extern "C" 把C的介面都括起來了),假定你的 libtest.a 放在 /home/aaa/lib下
g++ -o my.exe my.cpp -L/home/aaa/lib -ltest
就會生成可執行文件 my.exe了。
③ GCC編譯的時候總出個list.h錯誤,我頭文件沒有這個阿。我用源代碼中的例子程序編譯依然出這個錯,請高手
首先,確保你的頭文件隔離,以防止重復定義的宏。例如,開始file.h
#內容IFNDEF __ FILE__HEAD___
FILE__HEAD___
#定義__ / /頭文件
#ENDIF / / __ FILE__HEAD___
後使用
file.h的list.h所以file.h的介質的#include「list.h / /假設頭文件在同一目錄
list.h在二手preapre.h,使用list.h的中間#包括「prepare.h的」
在node.h prepare.h如此prepare.h的#包括「node.h的」
在某些情況下,因為代碼組織,或匯編成冊,這段代碼的組織能力問題,根據特定代碼的具體判斷。
另外,准確的頭文件是編譯器只是第一步,預處理,真正的「守則」,應該是一個源文件編譯原理,這個問題。
④ 急!LINUX下,GCC編譯,原程序包含<semaphore.h>頭文件,為什麼編譯時說sem_wait,sem_post等未定義的引用
編譯時加上參數:-lpthread
要看報錯的階段,是在編譯還是鏈接階段.
如果編譯時函數沒有找到,那是頭文件的問題,如果鏈接時未定義引用,那是c庫的問題.
如果你的頭文件都正常包含了,那可能你的c庫沒有使能semaphore的支持.
⑤ gcc 編譯時總是找不到系統的.h文件,高手幫忙啊
在安裝盤中找到stdio.h文件,然後把stdio.h 文件拷到/usr/include下.如果找不到,我可以給你發到郵箱中。
⑥ Linux中gcc的編譯過程包括哪幾步
gcc編譯分為四部;
第一步,預編譯,將程序中的宏定義等預編譯;
第二步,編譯,將*.h,*.c等文件編譯成為*.o文件;
第三步,匯編;
第四步,連接,將*.o文件連接庫,生成可執行文件!
⑦ 用gcc編譯時提示:fatal error: usb.h: No such file or directory
你好!
我用Dev-C++軟體出現了此錯誤提示,由於我用的win系統,so,樓上我不評價
情況是這樣,我想自己寫一個test.h測試頭文件,所以加了這樣一句
#include
編譯錯誤
搜索未果,於是換一種思考角度--「如何加入頭文件」,在知道里搜索到
如果是添加頭文件路徑,那麼也可以像上面這樣添加:#include"../myfile/myhead.h"
一般自己寫的用:#include
"
",庫文件用#include<>
蒟蒻勿噴!
如有疑問,請追問。
⑧ gcc編譯器頭文件處理
兩次相對比一下,第二次增加了以下函數的實現,這部分是要編譯成機器指令的,所以第二次這部分相當於是增加的。
intprintf(constchar*__format,...)
{
registerint__retval;
__builtin_va_list__local_argv;__builtin_va_start(__local_argv,__format);
__retval=__mingw_vprintf(__format,__local_argv);
__builtin_va_end(__local_argv);
return__retval;
}
那第二次減少了哪些呢?一點都沒有,因為stdio這個頭文件聲明的函數和變數,都是在一個庫中實現的,根本就不會包含在你的exe中,所以加不加stdio頭文件沒有區別。
要想驗證這個也很簡單:代碼1
#include<stdio.h>
intmain(){return0;}
代碼2:
intmain(){return0;}
比較這兩次產生的exe是否一致即可。
注意,不能帶有-g選項,-g選項會生成一些額外的調試信息
⑨ linux用gcc編譯
運行結果我不給了,自己看:
直接編譯:
gcc main.c compute.c input.c -o power
運行程序
./power
makefile 最簡單,直觀的的編寫方法:
power:main.o compute.o input.o
cc main.o compute.o input.o -o power
main.o:main.c main.h compute.h input.h
cc -c main.c
compute.o:compute.c compute.h
cc -c compute.c
input.o:input.c input.h
cc -c input.c
.PHONY : clean
clean :
rm -f *.o power
保存後成makefile或Makefile推薦使用後者:
make
想重新編譯前運行:
make clean
make
運行程序:
./power
特別說明:cc,rm命令行前有一個tab符,別搞錯了。cc 在linux上是指向gcc的軟符號鏈接,為了兼容其他系統,我們寫的cc。
makefile有更簡寫但不簡單的寫法,不給出來。你提問這個說明你不會編寫makefile,給出的是最基本用法。有興趣自己看,一天能學完。
⑩ 用gcc編譯時提示:fatal error: usb.h: No such file or directory
你在c語言中include 了<usb.h>,但是對於gcc來說,它並不知道該.h文件放在什麼地方,所以你要顯示地告訴它。加-I路徑就可以,利於usb.h放在c盤根目錄下,直接
gcc -c 文件名 -Ic:\ -o 輸出文件名