gcc編譯系統

一、 C語言編譯過程

C語言的編譯過程可分為四個階段:

1、預處理(Preprocessing)

對源程序中的偽指令(即以#開頭的指令)和特殊符號進行處理的過程。

偽指令包括:1)宏定義指令;

      2)條件編譯指令;

      3)頭文件包含指令;

2、編譯(Compilation)

編譯就是將源程序轉換為計算機可以執行的二進制代碼

說明:

  在Linux下,目標文件的缺省后綴為.o

  編譯程序將通過詞法分析和語法分析,將其翻譯成為等價的匯編代碼。

  在使用gcc進行編譯時,缺省情況下,不輸出這個匯編代碼的文件。如果需要,可以在編譯時指定-S選項。這樣,就會輸出同名的匯編語言文件。

3、匯編(Assembly)

匯編的過程實際上是將匯編語言代碼翻譯成機器語言的過程。

產生一個擴展名為.o的目標文件。

4、鏈接(Linking)

目標代碼不能直接執行,要想將目標代碼變成可執行程序,還需要進行鏈接操作。才會生成真正可以執行的可執行程序。

鏈接操作最重要的步驟就是將函數庫中相應的代碼組合到目標文件中。

二、文件名后綴

gcc可以針對支持不同的源程序文件進行不同的處理,文件格式以文件的后綴來識別。

文件名后綴

文件類型

.c

C源文件

.C .cpp .cc .c++ .cxx

C++源文件

.h

頭文件

.i

預處理后的C源文件

.s

匯編程序文件

.o

目標文件

.a

靜態鏈接庫

.so

動態鏈接庫

三、 gcc編譯器簡介

gcc(GNU Compiler Collection)

在Linux平臺上最常用的C語言編譯系統是gcc,它是GNU項目中符合ANSI C標準的編譯系統。

gcc的使用格式:

  ?gcc [options][filenames]

說明:當不用任何選項時,gcc將會生成一個名為a.out的可執行文件。

例子:在linux上編譯一個c程序(文件名為hello.c?;執行gcc hello.c)。

#include <stdio.h>

int main()

{

???? printf("hello world.\n");

???? ?? return 0;

}

運行編譯好的可執行c文件命令是./a.out

四、gcc編譯器的工作過程

1、預處理(Preprocessing)

2、編譯(Compilation & Assembly)

源代碼轉換為匯編語言(在編譯時選擇-S選項,可以看到生成的匯編代碼.s文件)

匯編代碼(.s)轉換為目標代碼(.o)

3、鏈接(Linking)

目標代碼與各庫函數進行鏈接并重定位,生成可執行程序。

五、gcc命令行選項

1、預處理選項

選項

說明

-D name

定義一個宏name,并可以指定值

-I dir

指定頭文件的路徑dir。先在指定的路徑中搜索要包含的頭文件,若找不到,則在標準路徑(/usr/include,/usr/lib及當前工作目錄)上搜索。

-E

只對文件進行預處理,不進行編譯、匯編、鏈接,生成的結果送標準輸出

即:只運行C預編譯器

-o file

將輸出寫到指定的文件file中

即:產生目標(.i 、.s 、 .o 、可執行文件等)

例子:使用 -I選項包含保存在非標準位置中的頭文件。

# gcc -I/usr/openwin/include file.c

例子:使用-D選項定義宏,其作用等價于在源文件中使用宏定義指令。

main()

{

??????? printf("display -D variable %s\n",DOPTION);

??????? printf("hello,everybody!!\n");

}

# gcc -D DOPTION='"testing -D"' hello.c

2、編譯程序選項

選項

說明

-o file1 file2

將文件file2編譯成可執行文件file1

如果未使用該選項,則可執行文件放在a.out

-S

只進行編譯,不進行匯編,生成匯編代碼文件擴展名為.s

即:告訴編譯器產生匯編語言文件后停止編譯

-c

只把源文件編譯成目標代碼.o,不進行匯編、鏈接。

用于實現對源文件的分別編譯

-g

在目標代碼中加入供調試程序gdb使用的附加信息

-v

顯示gcc版本

-Wall

顯示警告信息

例子:在gcc中使用-W控制警告信息。

# gcc -Wall -o hello1 hello1.c

例子:使用gcc的-g選項來產生調試符號,

# gcc -g -o test1 test1.c?????????

例子:多文件的編譯。

//meng1.c

#include <stdio.h>

main()

{

??????? int r;

??????? printf("enter an integer,please!\n");

???? ???scanf("%d",&r);

??????? square(r);

??????? return 0;

}

//meng2.c

#include <stdio.h>

int square(int x)

{

??????? printf("The square=%d\n",x*x);

??????? return (x*x);

}

編譯方法一:

# gcc -c meng1.c

# gcc -c meng2.c

# gcc meng1.o meng2.o -o meng12

編譯方法二:

# gcc -o meng13 meng1.c meng2.c

說明:

方法二不產生中間目標文件,直接生成一個可執行文件,因而,程序內容稍有改動,就要重新編譯全部程序。

3、優化程序選項

優化是編譯器的一部分,它可以檢查和組合編譯器生成的代碼,指出未達到最優的部分,并重新生成它們,從而使用戶編寫的程序更加完美且節省空間。

在gcc編譯器選項中,使用-O選項對代碼進行優化。

優化級別分3級,由高到低分別為:-O3、-O2、-O1

優化程序選項

選項

說明

-O1(-O)

對編譯出的代碼進行優化

-O2

進行比-O高一級的優化

-O3

產生更高級別的優化

說明:

-O1(或-O)、-O2、-O3分別代表優化級別,數字越高,代表gcc的優化級別越高,高的優化級別代表著程序將運行的更快。

優化級別越高則程序量越大。

直接優化程序本身,性能的提高的變化更加明顯。

4、連接程序選項

是一組預先編譯好的函數集合。

說明:

標準庫文件一般存儲在/lib和/usr/lib目錄中。

所有的庫名都以lib開頭。例如:libc.so(標準C語言函數庫)、libm.so(數學運算函數庫)

以.a結尾的是靜態庫;以.so結尾的庫是動態庫。

使用ar工具將目標文件收集起來,放到一個歸檔文件中。

連接程序選項

選項

說明

-L dir

將dir所指出的目錄加到“函數庫搜索列表”中

-llib

鏈接lib庫

-I name

連接時,加載名字為name的函數庫。該庫位于系統預設的目錄或者由-L選項確定的目錄下。

實際的庫名是libname(后綴為.a或.so)

說明:

鏈接過程通常的形式如下:

gcc -o file file.o -L dirname -lxxx

-L:指定了鏈接時用到的庫文件所在的目錄。

-lxxx:指示鏈接的庫函數名為libxxx.a

例子:編譯產生可執行文件hello,搜索數學庫以解決問題。

# gcc -o hello hello.c /usr/lib/libm.a

或者

# gcc -o hello hello.c -lm?

例子:創建一個小型庫

包含兩個函數pro1、pro2,然后在示例程序中調用其中一個函數。

/* pro1.c */

#include <stdio.h>

void pro1(int arg)

{

printf("hello:%d\n", arg);

}

/* pro2.c */

#include <stdio.h>

void pro2(char *arg)

{

printf("welcome to:%s", arg);

}

/* lib.h */

void pro1(int);

void pro2(char *);

/* program.c */

#include "lib.h"

int main()

{

pro2("Linux world.");

exit(0);

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255252.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255252.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255252.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自制反匯編逆向分析工具 迭代第六版本 (五)

本工具從最初版的跳轉分布圖只為了更直觀地分析反匯編代碼的分支結構&#xff0c;第三版開始對直觀圖進行逆向分支代碼的輸出&#xff0c;第四版對分支輸出策略的一些探索&#xff0c;第五版結合之前的探索進行改進。第六版在現在功能的基礎上進行增強&#xff0c;利用第六版&a…

模型搜索 及 輪廓搜索 的原理

模型搜索 及 輪廓搜索 的原理

Linux中設置vim自動在運算符號兩邊加上空格

vim中設置自動在-之類的運算符號左右兩邊加上空格。原版的vim不帶這個功能&#xff0c;寫出的代碼例如zxy&#xff0c;不美觀&#xff0c;很多編譯器&#xff08;如VS&#xff09;能夠自動在符號兩邊加上空格&#xff0c;如z x y&#xff0c;看起來比較美觀。 只要在.vimrc里…

HALCON示例程序class_ndim_norm.hdev基于多通道圖像的分類

HALCON示例程序class_ndim_norm.hdev基于多通道圖像的分類 示例程序源碼&#xff08;加注釋&#xff09; 讀入圖片 read_image (Image, ‘ic’)得到圖片大小 get_image_size (Image, Width, Height)關閉窗口 dev_close_window ()根據圖片大小打開窗口 dev_open_window (0, 0,…

centos7搭建FTP服務器

1.   使用 yum 安裝 vsftpd&#xff1a;yum install -y vsftpd 2.  啟動 VSFTPD&#xff1a;systemctl start vsftpd.service 3.  啟動后可監聽到21端口&#xff1a;netstat -nltp | grep 21 4.  配置FTP權限&#xff1a;&#xff08;vsftpd.conf&#xff0c;修改前先備…

[HDOJ2586]How far away?(最近公共祖先, 離線tarjan, 并查集)

題目鏈接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2586 這題以前做過…現在用tarjan搞一發…竟然比以前暴力過的慢………… 由于是離線算法&#xff0c;需要Query來保存查詢數據&#xff0c;Ans來保存結果。最后輸出的時候按照idx的順序輸出&#xff0c;所以胡搞…

愛普生SCARA機器人參考文檔列表

愛普生SCARA機器人參考文檔列表軟件EPSON RC 5.0 用戶指南記載了機器人系統與程序開發軟件。 - 安全 - 機器人系統的操作與設定 - 程序開發軟件 EPSON RC GUI的操作 - SPEL語言、應用程序 - 機器人…

HALCON示例程序classify_citrus_fruits.hdev應用常規gmm分類器進行水果分類

HALCON示例程序classify_citrus_fruits.hdev應用常規gmm分類器進行水果分類 示例程序源碼&#xff08;加注釋&#xff09; 讀入圖片、顯示與顯示相關設置 read_image (Image, ‘color/citrus_fruits_01’) get_image_pointer1 (Image, Pointer, Type, Width, Height) dev_clos…

python進階10 MySQL補充 編碼、別名、視圖、數據庫修改

python進階10 MySQL補充 編碼、別名、視圖、數據庫修改 一、編碼問題 #MySQL級別編碼 #修改位置&#xff1a; /etc/mysql/mysql.conf.d/mysqld.cnf default-character-set utf8character-set-server utf8 collation-server utf8_general_ci#最佳實踐 #1、無論mysql是否設…

教你如何剖析源碼

一、源碼閱讀需求 在學習中&#xff0c;我們會需要了解&#xff0c;學習&#xff0c;使用一個框架&#xff0c;一個新的函數庫。在工作中&#xff0c;因為業務需求&#xff0c;因為性能問題&#xff0c;可能通過一個更高性能的工具&#xff0c;架構去優化我們的程序。 那么&…

SPEL + 中的錯誤處理

SPEL 中的錯誤處理 如果在SPEL程序中發生錯誤&#xff0c;可以將執行轉到錯誤處理例程中進行錯誤處理。該例程必須在函數定義內。下一頁的表格顯示了用于錯誤處理的程序指令。 項目 目的 OnErr 使用OnErr語句定義錯誤處理…

HALCON示例程序classify_halogen_bulbs.hdev使用SVM分類器檢測鹵素燈泡的好壞

HALCON示例程序classify_halogen_bulbs.hdev使用SVM分類器檢測鹵素燈泡的好壞 示例程序源碼&#xff08;加注釋&#xff09; 得到halcon默認圖片存儲路徑 get_system (‘image_dir’, HalconImages) 獲得操作系統類型 get_system (‘operating_system’, OS) OS{0:2}的意思是…

php調用API支付接口(轉自劉68)

首先訪問 https://charging.teegon.com/ 注冊賬號&#xff0c; 找到開發配置 記下client_id和client_secret。 點擊 天工開放平臺 點擊天工收銀 點擊 SDK下載與使用 選擇php版下載 解壓后獲得 打開form.php這個是樣板文件可以用它來測試是否成功&#xff0c;測試前需要先修…

S3C2440 SPI驅動框架

S3C2440 SPI驅動代碼詳細解讀&#xff1a; https://www.linuxidc.com/Linux/2012-08/68402p4.htm 一、platform device and board_info /* /arch/arm/plat-s3c24xx*/static struct resource s3c_spi0_resource[] { [0] {.start S3C24XX_PA_SPI,.end S3C24XX_PA_SPI 0…

單目相機標定原理

一&#xff0e;相機標定主要涉及三個坐標系&#xff1a;圖像坐標系、攝像機坐標系和世界坐標系 【圖像坐標系】 攝像機采集的圖像變換為數字圖像后&#xff0c;每副數字圖像在計算機內為M x N數組&#xff0c;M行N列的圖像中每一個元素&#xff08;pixel&#xff09;數值就是圖…

HALCON示例程序classify_image_class_gmm.hdev使用GMM分類器分割彩色圖片

HALCON示例程序classify_image_class_gmm.hdev使用GMM分類器分割彩色圖片 示例程序源碼&#xff08;加注釋&#xff09; dev_update_off () dev_close_window () dev_open_window (0, 0, 735, 485, ‘black’, WindowHandle) set_display_font (WindowHandle, 14, ‘mono’, …

Android開始之 activity_lifecycle和現場保護

生命周期&#xff1a; oncreate—onstart—onresume&#xff0c;--onpause--onstop&#xff0c;——onrestart——onstart——onresume&#xff0c;。。onpause。。。onstop。。。ondestroy 現在保護---保存系統狀態 通過這個方法保存到數據庫中或者xml中&#xff0c;&#xff…

Apache啟動錯誤:could not bind to address[::]:443

Q&#xff1a;Windows環境下啟動apache報錯如下&#xff1a; 可是在httpd.conf文件中apache listen的明明是http 80端口&#xff0c;為什么會報443的錯誤&#xff1f; A&#xff1a;因為你的計算機安裝了VM&#xff0c;所有有個vm的進程一直占用著443端口&#xff0c;在命令行下…

針孔相機拍攝的圖像坐標和空間點的對應關系

一&#xff1a;攝像機成像原理 攝像機成像模型一般有三種&#xff1a;透鏡投影模型&#xff08;小孔攝像機模型&#xff09;、正交投影模型和透視投影模型 光學中最基本的高斯成像公式&#xff1a;1/u 1/v 1/f (式一) 原理圖如下&#xff1a; 二&#xff1a;認識三個…

window.onload中動態獲得img的高度

$(function(){}); window.οnlοadfunction(){} $(function(){}) 是在DOM結構渲染完成以后調用的&#xff0c;這時候網頁中一些資源還沒有加載&#xff0c;比如圖片等資源&#xff0c;但是DOM結構已經渲染成功了 window.onload是在網頁DOM結構渲染完成&#xff0c;而且資源已經…