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.mzph.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;而且资源已经…