1. 程式人生 > >Linux環境下編寫C程序

Linux環境下編寫C程序

gcc gdb Linux環境下編寫包括頭文件C程序出

一:gcc編譯鏈接
用法:gcc [選項] 文件...
選項:
-pass-exit-codes 在某一階段退出時返回最高的錯誤碼
--help 顯示此幫助說明
--target-help 顯示目標機器特定的命令行選項
--help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]
顯示特定類型的命令行選項
(使用‘-v --help’顯示子進程的命令行參數)
--version 顯示編譯器版本信息
-dumpspecs 顯示所有內建 spec 字符串
-dumpversion 顯示編譯器的版本號
-dumpmachine 顯示編譯器的目標處理器
-print-search-dirs 顯示編譯器的搜索路徑
-print-libgcc-file-name 顯示編譯器伴隨庫的名稱
-print-file-name=<庫> 顯示 <庫> 的完整路徑
-print-prog-name=<程序> 顯示編譯器組件 <程序> 的完整路徑
-print-multiarch Display the target‘s normalized GNU triplet, used as
a component in the library path
-print-multi-directory 顯示不同版本 libgcc 的根目錄
-print-multi-lib 顯示命令行選項和多個版本庫搜索路徑間的映射
-print-multi-os-directory 顯示操作系統庫的相對路徑
-print-sysroot 顯示目標庫目錄
-print-sysroot-headers-suffix 顯示用於尋找頭文件的 sysroot 後綴
-Wa,<選項> 將逗號分隔的 <選項> 傳遞給匯編器
-Wp,<選項> 將逗號分隔的 <選項> 傳遞給預處理器
-Wl,<選項> 將逗號分隔的 <選項> 傳遞給鏈接器
-Xassembler <參數> 將 <參數> 傳遞給匯編器
-Xpreprocessor <參數> 將 <參數> 傳遞給預處理器
-Xlinker <參數> 將 <參數> 傳遞給鏈接器
-save-temps 不刪除中間文件
-save-temps=<arg> 不刪除中間文件
-no-canonical-prefixes 生成其他 gcc 組件的相對路徑時不生成規範化的
前綴
-pipe 使用管道代替臨時文件
-time 為每個子進程計時
-specs=<文件> 用 <文件> 的內容覆蓋內建的 specs 文件
-std=<標準> 指定輸入源文件遵循的標準
--sysroot=<目錄> 將 <目錄> 作為頭文件和庫文件的根目錄
-B <目錄> 將 <目錄> 添加到編譯器的搜索路徑中
-v 顯示編譯器調用的程序
-### 與 -v 類似,但選項被引號括住,並且不執行命令
-E 僅作預處理,不進行編譯、匯編和鏈接
-S 編譯到匯編語言,不進行匯編和鏈接
-c 編譯、匯編到目標代碼,不進行鏈接
可以對單個文件只編譯,避免程序出錯
-o <文件> 輸出到 <文件>

-pie Create a position independent executable
-shared Create a shared library
-x <語言> 指定其後輸入文件的語言
允許的語言包括:c c++ assembler none
‘none’意味著恢復默認行為,即根據文件的擴展名猜測
源文件的語言

gcc + 文件名  默認生成a.out可執行文件

以 -g、-f、-m、-O、-W 或 --param 開頭的選項將由 gcc 自動傳遞給其調用的
不同子進程。若要向這些進程傳遞其他選項,必須使用 -W<字母> 選項。

二. ./[可執行文件] 執行程序
./指當前目錄,./ 文件指執行當前目錄下文件 。/a.out 表示執行a.out可執行文件

三. gdb調試
1.輸入file 文件,表示gdb調試的對象;
2.輸入l,顯示出程序的代碼;
3.輸入b n(數字) 表示設置的斷點位置;
4.輸入r表示調試開始;
5.輸入s或n(字母)表示進入下一步;
6.輸入p 變量名可查看該變量的數值;
7.輸入q 退出gdb調試。

四.編寫簡單的不包括頭文件的程序
以編寫helloworld程序為例。
1.用ctrl+alt+T來打開終端
2.要在某個文件夾裏創建文本,首先要回到該文件夾的目錄。如我在桌面(desktop)建立文本。 (在終端中輸入)
cd Desktop //然後按下回車
3.創建文件夾(此步驟可跳過,但建議創建)
mkdir 文件名
4.建立文本
gedit hello world.c //然後按下回車,會跳出一個類似於windows的記事本
5.往裏面敲代碼
C

include <stdio.h>

int main(void) { 
printf("hello world!"); 
return 0; 
} 

6.保存代碼,關閉文本框。
按esc,再輸入:wq(一開始看不到盡管輸進去,wq為保存並關閉,也可為w則為保存不關閉) 
7.啟動gcc對代碼進行編譯。 
gcc helloworld.c -o execFile(此步驟會生成一個execFlie的文件,可用ls查看)
8.如果有錯誤,系統會提示,按方向鍵找回gedit helloworld.c 的指令,按下回車,彈出文本框後根據系統提示對代碼進行修改,完成後記得保存,
關閉文本框。 
9.運行
./execFlie則會開始運行
7.如果要進行調試,請參考我的第三部分:“有關編寫C語言的指令”。

五.編寫包括頭文件的程序
如://test.h

#ifndef TEST_H
#define
TESH_H

void print();
#endif

//test.c
#include<stdio.h>
#include"test.h"
void print()
{printf("this is ja test\n");}

//main.c
#include"test.h"
int main()
{print();return 0;
}
如果只編譯main.c就會出現“函數未定義”的錯誤,這是編譯不完整的原因,所以無法鏈接到所需要的函數。

真確的編譯方法如下:
gcc -c main.c # -c參數的作用是讓gcc只編譯,不鏈接
gcc -c test.c
gcc -o main main.o test.o # 將編譯好的目標代碼鏈接

Linux環境下編寫C程序