中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux里的gcc怎么使用

發布時間:2023-04-18 14:13:51 來源:億速云 閱讀:151 作者:iii 欄目:建站服務器

今天小編給大家分享一下linux里的gcc怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

在linux中,gcc全稱“GNU Compiler Collection”,中文意思為“GNU編譯器套件”,是由GNU開發的編程語言編譯器,是一個能夠編譯多種語言的編譯器。gcc套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go語言前端,也包括了這些語言的庫。

1、什么是gcc

GCC(GNU Compiler Collection,GNU編譯器套件)是由GNU開發的編程語言編譯器,它是一個能夠編譯多種語言的編譯器。GNU編譯器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go語言前端,也包括了這些語言的庫(如libstdc++,libgcj等。)

最開始gcc是作為C語言的編譯器(GNU C Compiler),現在除了c語言,還支持C++、java、Pascal等語言。gcc支持多種硬件平臺。

2、gcc的特點

  • gcc是一個可移植的編譯器,支持多種硬件平臺。例如ARM、X86等等。

  • gcc不僅是個本地編譯器,它還能跨平臺交叉編譯。所謂的本地編譯器,是指編譯出來的程序只能夠在本地環境進行運行。而gcc編譯出來的程序能夠在其他平臺進行運行。例如嵌入式程序可在x86上編譯,然后在arm上運行。

  • gcc有多種語言前端,用于解析不同的語言。

  • gcc是按模塊化設計的,可以加入新語言和新CPU架構的支持。

  • gcc是自由軟件。任何人都可以使用或更改這個軟件。

3、gcc編譯程序的過程

gcc編譯程序主要經過四個過程:

  • 預處理(Pre-Processing)

  • 編譯 (Compiling)

  • 匯編 (Assembling)

  • 鏈接 (Linking)

linux里的gcc怎么使用


預處理實際上是將頭文件、宏進行展開。編譯階段,gcc調用不同語言的編譯器,例如c語言調用編譯器ccl。gcc實際上是個工具鏈,在編譯程序的過程中調用不同的工具。匯編階段,gcc調用匯編器進行匯編。鏈接過程會將程序所需要的目標文件進行鏈接成可執行文件。匯編器生成的是可重定位的目標文件,學過操作系統,我們知道,在源程序中地址是從0開始的,這是一個相對地址,而程序真正在內存中運行時的地址肯定不是從0開始的,而且在編寫源代碼的時候也不能知道程序的絕對地址,所以重定位能夠將源代碼的代碼、變量等定位為內存具體地址。

下面以一張圖來表示這個過程,注意過程中文件的后綴變化,編譯選項和這些后綴有關。

這是GCC編譯的四個步驟。

4、gcc常用選項

來看一下gcc常用選項

linux里的gcc怎么使用

現在我們有源文件hello.c,下面是一些gcc的使用示例:

gcc -E hello.c -o hello.i   對hello.c文件進行預處理,生成了hello.i 文件
gcc -S hello.i -o hello.s    對預處理文件進行編譯,生成了匯編文件
gcc -c hello.s -o hello.o  對匯編文件進行編譯,生成了目標文件
gcc hello.o -o hello 對目標文件進行鏈接,生成可執行文件
gcc hello.c -o hello 直接編譯鏈接成可執行目標文件
gcc -c hello.c 或 gcc -c hello.c -o hello.o 編譯生成可重定位目標文件

使用gcc時可以加上-Wall選項。下面這個例子如果不加上-Wall選項,編譯器不會報出任何錯誤或警告,但是程序的結果卻不是預期的:

//bad.c
#include<stdio.h>
int main()
{
    printf("the number is %f ",5);  //程序輸出了the number is 0.000000,結果錯誤
    return 0;
 }

使用-Wall選項:

gcc -Wall bad.c -o bad

gcc將輸出警告信息:

warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=]
printf("the number is %f\n",5);

5、gcc編譯多個文件

// hello.c
#include<stdio.h>
#include"hello.h"
void printHello()
{
        printf("hello world!\n");
}
//main.c
#include<stdio.h>
#include"hello.h"
int main()
{
        printHello();
        return 0;
}
//hello.h
//僅包含函數聲明
#ifndef _HELLO_
#define _HELLO_
void printHello();
#endif

編譯這三個文件,可以一次編譯:

gcc hello.c main.c -o main 生成可執行文件main

也可以獨立編譯:

gcc -Wall -c main.c -o main.o
gcc -Wall -c hello.c -o hello.o
gcc -Wall main.o hello.o -o main

獨立編譯的好處是,當其中某個模塊發送改變時,只需要編譯該模塊就行,不必重新編譯所有文件,這樣可以節省編譯時間。

6、使用外部庫

在使用C語言和其他語言進行程序設計的時候,我們需要頭文件來提供對常數的定義和對系統及庫函數調用的聲明。庫文件是一些預先編譯好的函數集合,那些函數都是按照可重用原則編寫的。它們通常由一組互相關聯的可重用原則編寫的,它們通常由一組互相關聯的用來完成某項常見工作的函數構成。使用庫的優點在于:

  • 模塊化的開發

  • 可重用性

  • 可維護性

庫又可以分為靜態庫與動態庫:

  • 靜態庫(.a):程序在編譯鏈接的時候把庫的代碼鏈接到可執行文件中。程序運行的時候將不再需要靜態庫。靜態庫比較占用磁盤空間,而且程序不可以共享靜態庫。運行時也是比較占內存的,因為每個程序都包含了一份靜態庫。

  • 動態庫(.so或.sa):程序在運行的時候才去鏈接共享庫的代碼,多個程序共享使用庫的代碼,這樣就減少了程序的體積。

一般頭文件或庫文件的位置在:

  • /usr/include及其子目錄底下的include文件夾

  • /usr/local/include及其子目錄底下的include文件夾

  • /usr/lib

  • /usr/local/lib

  • /lib

7、生成靜態庫

為了生成.a文件,我們需要先生成.o文件。下面這行命令將我們的hello.o打包成靜態庫libhello.a:

ar rcs libhello.a hello.o

ar是gun歸檔工具,rcs表示replace and create,如果libhello之前存在,將創建新的libhello.a并將其替換。

然后就可以這樣來使用靜態庫libhello.a

gcc -Wall main.c libhello.a -o main

還有另外一種使用方式:

gcc -Wall -L. main.c -o main -lhello 【lhello 是 libhello的縮寫】

其中 -L.表示庫文件的位置在當前目錄下,由于libhello.a是我們自己生成的,并存放在當前錄下下,所以需要加上-L.選項。默認庫文件是在系統的目錄下進行搜索。同樣的,-I.選項用于頭文件的搜索。

8、生成共享庫

生成一個共享庫,名稱的規則是libxxx.so。將剛才hello.o生成libhello.so的命令為:

gcc -shared -fPIC hello.o -o libhello.so

生成了共享庫之后,可以這樣來使用共享庫:

gcc -Wall main.o -o main -L. -lhello

該命令與使用靜態庫的命令相同,但是在共享庫與靜態庫共存的情況下,優先使用共享庫。

共享庫有時候并不不在當前的目錄下,為了讓gcc能夠找得到共享庫,有下面幾種方法:

  • 拷貝.so文件到系統共享庫路徑下,一般指/usr/lib

  • 在~/.bash_profile文件中,配置LD_LIBRARY_PATH變量

  • 配置/etc/ld.so.conf,配置完成后調用ldconfig更新ld.so.cache

其中,shared選項表示生成共享庫格式。fPIC表示產生位置無關碼(position independent code),位置無關碼表示它的運行、加載與內存位置無關,可以在任何內存地址進行加載。

9、庫的搜索路徑

庫的搜索路徑遵循幾個搜索原則:從左到右搜索-I -l指定的目錄,如果在這些目錄中找不到,那么gcc會從由環境 變量指定的目錄進行查找。頭文件的環境變量是C_INCLUDE_PATH,庫的環境變量是LIBRARY_PATH.如果還是找不到,那么會從系統指定指定的目錄進行搜索。

以上就是“linux里的gcc怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰宁县| 阿城市| 绥棱县| 商城县| 新安县| 苏州市| 清原| 浦县| 抚顺县| 子长县| 通州市| 桃园县| 彭泽县| 日土县| 东乌| 太谷县| 台山市| 罗城| 东台市| 绥阳县| 广西| 定西市| 芷江| 苗栗县| 类乌齐县| 铜梁县| 双流县| 新野县| 绥宁县| 新密市| 南京市| 浑源县| 泸水县| 长岛县| 和平区| 三原县| 宁安市| 荔波县| 大连市| 蚌埠市| 辰溪县|