Apakah gcc dalam linux

青灯夜游
青灯夜游asal
2023-04-18 13:41:464381semak imbas

Dalam Linux, nama penuh gcc ialah "Koleksi Penyusun GNU", yang bermaksud "Suite Pengkompil GNU" dalam bahasa Cina Ia ialah pengkompil bahasa pengaturcaraan yang dibangunkan oleh GNU dan merupakan pengkompil yang boleh menyusun berbilang bahasa. Suite gcc termasuk bahagian hadapan bahasa C, C++, Objektif-C, Fortran, Java, Ada dan Go, serta perpustakaan untuk bahasa ini.

Apakah gcc dalam linux

Persekitaran pengendalian tutorial ini: sistem linux7.3, komputer Dell G3.

1. Apakah itu gcc

GCC (GNU Compiler Collection, GNU compiler suite) ialah pengkompil bahasa pengaturcaraan yang dibangunkan oleh GNU penyusun yang mampu menyusun pelbagai bahasa. Suite pengkompil GNU termasuk bahagian hadapan bahasa C, C++, Objective-C, Fortran, Java, Ada dan Go, serta perpustakaan untuk bahasa ini (seperti libstdc++, libgcj, dll.)

Pada mulanya gcc digunakan sebagai C Pengkompil bahasa (GNU C Compiler) kini menyokong C++, Java, Pascal dan bahasa lain selain bahasa C. gcc menyokong berbilang platform perkakasan.

2. Ciri-ciri gcc

  • gcc ialah pengkompil mudah alih yang menyokong berbilang platform perkakasan. Contohnya, ARM, X86, dsb.
  • gcc bukan sahaja pengkompil tempatan, ia juga boleh menyusun silang merentas platform. Pengkompil tempatan yang dipanggil bermaksud program yang disusun hanya boleh dijalankan dalam persekitaran tempatan. Program yang disusun dengan gcc boleh dijalankan pada platform lain. Sebagai contoh, program terbenam boleh disusun pada x86 dan kemudian dijalankan pada lengan.
  • gcc mempunyai hujung hadapan berbilang bahasa untuk menghuraikan bahasa yang berbeza.
  • gcc direka bentuk untuk menjadi modular dan boleh menambah sokongan untuk bahasa baharu dan seni bina CPU baharu.
  • gcc ialah perisian percuma. Sesiapa sahaja boleh menggunakan atau menukar perisian ini.

3 Proses program kompilasi gcc

program kompilasi gcc terutamanya melalui empat proses:

  • Pra-Pemprosesan
  • Menyusun
  • Memasang
  • Memaut
Apakah gcc dalam linux


Prapemprosesan sebenarnya mengembangkan fail pengepala dan makro. Semasa fasa penyusunan, gcc memanggil penyusun bahasa yang berbeza, contohnya, bahasa c memanggil ccl pengkompil. Gcc sebenarnya adalah rantai alat yang memanggil alat yang berbeza semasa proses menyusun atur cara. Semasa fasa pemasangan, gcc memanggil pemasang untuk pemasangan. Proses pemautan akan memautkan fail objek yang diperlukan oleh program ke dalam fail boleh laku. Penghimpun menjana fail objek yang boleh dipindahkan Selepas mengkaji sistem pengendalian, kita tahu bahawa alamat dalam program sumber bermula dari 0. Ini adalah alamat relatif, dan alamat semasa program itu sebenarnya berjalan dalam memori pastinya tidak bermula dari. 0. Ia bermula dengan 0, dan alamat mutlak program tidak dapat diketahui semasa menulis kod sumber, jadi relokasi boleh mencari kod sumber, pembolehubah, dsb. sebagai alamat memori tertentu.

Berikut ialah gambar untuk mewakili proses ini Beri perhatian kepada perubahan akhiran fail semasa proses ini.

Ini ialah empat langkah kompilasi GCC.

4. pilihan biasa gcc

Mari kita lihat pilihan biasa gcc

Apakah gcc dalam linux

Sekarang kami mempunyai fail sumber hello.c, berikut adalah beberapa contoh penggunaan 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
#includeade979de5fc0e1ca0540f360a64c230b
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
#includeade979de5fc0e1ca0540f360a64c230b
#include"hello.h"
void printHello()
{
        printf("hello world!\n");
}
//main.c
#includeade979de5fc0e1ca0540f360a64c230b
#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视频教程

Atas ialah kandungan terperinci Apakah gcc dalam linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:apa itu firmware linuxArtikel seterusnya:apa itu firmware linux