1.gcc程序编译

author author     2022-09-04     166

关键词:

  Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大,性能优越的多平台编译器,是GNU的代表作之一。gcc可以在多个硬件平台上编译出可执行的程序,其执行效率与一般的编译器相比,效率要高20%~30%。

  GCC编译器能将C,C++语言源程序,汇编程序编译,链接成可以执行文件,在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。使用GCC编译程序时,编译过程可以被细分为四个阶段:

  (1)预编译(Pre-Processing)

  (2)编译(Compiling)

  (3)汇编(Assembling)

  (4)链接(Linking)

GCC通过后缀来区分输入文件的类别:

  .c为后缀的文件:C语言源代码文件

  .a为后缀的文件:由目标文件构成的库文件

  .C , .cc或.cxx为后缀的文件:是C++源代码文件

  .h为后缀的文件:头文件

  .i为后缀的文件:是已经预处理过的C源代码文件

  .ii为后缀的文件:是已经预处理过的C++源代码文件

  .o为后缀的文件:是编译后的目标文件

  .s为后缀的文件:是汇编语言源代码文件

  .S为后缀的文件:是经过预编译的汇编语言源代码文件

 

gcc的基本用法是:gcc [options][filenames]

  options:编译器所需要的编译选项

  filenames:要编译的文件名

简单的程序演示:

  技术分享

编译和运行这段程序:

  技术分享

gcc编译选项(option)大约有100多个,其中多数我们不会用到,这里只是介绍其中最基本,最常用的参数。

(1)-o output_filename: 确定可执行文件的名称为output_filename。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

(2)-c:只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。

  技术分享

(3)-g:产生调试工具(GNU的gdb)所必要的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。

(4)-O:对程序进行优化编译,链接,采用这个选项整个源代码会在编译链接过程中优化处理,这样产生的可执行文件的执行效率会提高,但是编译链接的速度就相应的慢些。

  技术分享

  

  同一个程序,上面没有优化,下面优化过,编译时间差别很大

(5)-O2:比-O更好的优化编译链接,编译链接过程会更慢

(6)-Idirname:将dirname所指出的目录加入到程序头文件目录列表中。例如:gcc  –I/home/part  hello.c

  C程序中的头文件包含两种情况:

    1. #include <A.h>

    2.#include “B.h”

  对于<>, 预处理程序cpp在系统预设的头文件目录(如/usr/include)中搜寻相应的文件,而对于””,cpp在当前目录中搜寻文件。这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。

(7)-Ldirname: 将dirname所指出的目录加入到库文件的目录列表中,在默认状态下,连接程序Id在系统的预设路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。

(8)-lname: 在连接时,装载名字为”libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为”libm.a”的数学函数库。

  例: gcc  foo.c  -L /home/lib  -lfoo  -o  foo

(9)-static: 静态链接库文件,例:gcc  –static  hello.c  –o  hello

  库有动态与静态两种,动态通常用.so为后缀,静态通常用.a为后缀。例如:libhello.so  libhello.a 。当使用静态库时,连接器找出程序所需的函数,然后将它们拷贝到可执行文件,一旦连接成功,静态程序库也就不再需要了。然而对于动态库而言,就不是这样,动态库会在执行程序内留下一个标记,指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库。

(10)-Wall: 生成所有的警告信息

(11)-w: 不生成任何警告信息

(12)-DMACRO: 定义MACRO宏,等效于在程序中使用#define MACRO

 

c程序编译链接gcc使用命令介绍

1.gcc或者g++安装rpm-qa|grepgcc==>检查gcc是否安装gcc-v==>检查gcc版本编译器会在可执行文件中植入一些信息,可执行文件会变大。一般开发时候使用-g,编译一个“release版本”时不使用-g编译。gcc如果是最新的则不重新编译链接。c... 查看详情

gcc|gcc编译器

gcc编译器1.gcc编译流程及编译选项分析1-1.预处理阶段1-2.编译阶段1-3.汇编阶段1-4.链接阶段2.gcc编译选项分析2-1.总体选项2-2.警告和出错选项2-3:优化信息2-4:体系结构相关选项3.拓展 gcc编译器GCC(GNUCompilerCollection,GNU编译器套装... 查看详情

linux——gcc/g++的使用(代码片段)

...使用gcc编译器。那么,我们写的test.c编译生成可执行程序经过以下步骤:下面我将通过gcc中的选项来说明预处理和&# 查看详情

linux怎么运行c程序

...至Linux的许多内核和许多其他自由软件以及开放源码应用程序都是用C语言编写并经gcc编译而成的.1.编译单个源文件[例如]在屏幕上打印"Hello,Linux."[源代码]#include<stdio.h>#include<stdlib.h>intmain(intargc,char**argv)printf("He... 查看详情

linux编译器gcc/g++调试器gdb项目自动化构建工具make/makefilegit

...;+或C语言预处理、编译、汇编、链接Linuxgcc生成可执行程序的4个步骤:预处理、编译、汇编、链接gcc如何完成?格式:g 查看详情

gcc介绍(代码片段)

...文件.h预处理文件(头文件).o目标文件.a存档文件2.gcc编译程序的流程源文件(hello.c)——>预处理(预处理器)——>编译(编译器)——>汇编( 查看详情

gcc源码编译

1.gcc源码下载ftp://gcc.gnu.org/pub/gcc/releases/[[email protected]~]wgetftp://gcc.gnu.org/pub/gcc/releases/gcc-8.2.0/gcc-8.2.0.tar.gz[[email protected]~]tarzxvfgcc-8.2.0.tar.gz下载你所需要的GCC版本。2.下载g 查看详情

gcc编译器

gcc编译器的使用1.gcc编译流程①gcc的编译流程为预编译、编译、汇编(生成目标文件)、链接(生成可执行的文件)。②例:编译当前目录下的test.c文件并执行。●创建test.c文件,并输入代码,如图所示。●图为使用vi创建文件  2.... 查看详情

gcc/g++编译(生动形象,从最容易入手的helloworld解释了库的概念)

...)生成.o的文件[汇编器as] (4).连接目标代码,生成可执行程序[链接器ld][参数详解] -xlanguagefilename  & 查看详情

gcc-i-l-l区别

我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:例子1:gcc-oexample1example1.c -I/usr/local/include/freetype2-lfreetype-lm上面这句话在编译example1.c 时,-... 查看详情

gcc-i-l-l区别

我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:例子1:gcc-oexample1example1.c -I/usr/local/include/freetype2-lfreetype-lm上面这句话在编译example1.c 时,-... 查看详情

如何区分make/makefile/cmake/nmake

...程语言(括C、C++、Objective-C、Fortran、Java等等)。我们的程序只有一个源文件时,直接就可以用gcc命令编译它。可是,如果我们的程序包含很多个源文件时,用gcc命令逐个去编译,很容易混乱而且工作量大,所以出现了make工具。... 查看详情

gcc基本功能以及常见编译选项

1、gcc xxx.c主要包含以下4部分功能:(1) 预处理:主要实现对头文件的包含以及宏替换等(2)编   译:主要将高级语言转换为汇编语言(3) 汇   编:主要将汇编语言翻译成机器指令,得到目标文件(4)&n... 查看详情

源代码到可执行程序的过程详解:预编译编译汇编链接(代码片段)

1、gcc编译过程分解(1)首先是将.c源文件和.h头文件经过预编译(cpp是预编译器),得到.i文件,主要是进行的一些替换工作;(2)将.i文件经过编译器(gcc)处理,得到.s汇编文件,现在文件内容已经从C语言编程了汇编... 查看详情

gcc常用命令

1.gcc-Esource_file.c  -E,只执行到预编译。直接输出预编译结果。2.gcc-Ssource_file.c   -S,只执行到源代码到汇编代码的转换,输出汇编代码。3.gcc-csource_file.c  -c,只执行到编译,输出目标文件。4.gcc(-E/S/c/)source_file.c-ooutput_... 查看详情

g++和gcc有啥区别?

...gcc和g++是GNUCompilerCollection(曾是GNUCCompiler)的编译器驱动程序。尽管它们会根据文件类型自动确定要调用的后端( 查看详情

struct内存对齐1:gcc与vc的差别

struct内存对齐:gcc与VC的差别内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法。Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T... 查看详情

8静态函数库设计

...链接库  2、动态链接库函数库 -存放位置Linux应用程序使用的主要函数库均存放于/lib,/usr/lib目录下,其中采用*.so.*方式命名的是动态函数库,而以*.a方式命令的是静态函数库。静态链接库-特点1、程序所要用到的库函数代... 查看详情