1-1 编程基础 GCC程序编译
GCC简介
Linux系统下的gcc是GNU推出的强大、性能优越的多平台编译器,是GNU的代表作之一。gcc可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平局效率要高20%~30%。
gcc编译器能将C、C++源程序、汇编程序编译、链接成可执行文件。
在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。
使用gcc编译程序时,编译过程可以被细分为四个阶段:
- 预处理(Pre-Processing)
- 编译(Compiling)
- 汇编(Assembling)
- 链接(Linking)
文件类型
gcc通过后缀来区别输入文件的类别:
.c为后缀的文件:C语言源代码文件
.a为后缀的文件:是由目标文件构成的库文件
.C,.cc或.cxx为后缀的文件:C++源代码文件
.h为后缀的文件:头文件
.i为后缀的文件:是已经预处理过的C源代码文件
.ii为后缀的文件:已经预处理过的C++源代码文件
.o为后缀的文件:编译后的目标文件
.s为后缀的文件:汇编语言源代码文件
.S为后缀的文件:经过预编译的汇编语言源代码文件。
hello.c
#include<stdio.h>
int main(void)
{
printf("Hello world!\n");
return ;
}
编译和运行这段程序
#gcc hello.c -o hello
#./hello
输出:hello world!
gcc最基本的用法
gcc最基本的用法是:
gcc [options] [filenames]
options:编译器所需要的编译选项
filenames:要编辑的文件名。
编译选项
gcc编译器的编译选项大约有100多个,其中多数我们根本就用不到,这里只介绍其中最基本、最常用的参数。
-o ouput_filename:确定可执行文件的名称为output_filename。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-c:只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。
-g:产生调试工具(GNU的gdb)所必要地符号信息,要想对编译出的程序进行调试,就必须加入这个选项。
-O:对程序进行优化编译、链接,采用这个选项,整个代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。
-O2:比-O更好的优化编译、链接,当然整个编译、链接过程会更慢。
-Idirname:将dirname所指出的目录加入到程序头文件目录列表中。(-I是大写的i)
C程序中的头文件包含两种情况:
1.#include<A.h>
2.#include"B.h"
对于<>,预处理程序cpp在系统预设的头文件目录(如/usr/include)中搜寻相应的文件;而对于"",cpp在挡墙目录中搜寻头文件。
这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirnam目录中去寻找。
例:gcc foo -I/home/include -o foo
-Ldirname:将dirname所指出的目录加入到库文件的目录列表中。在默认状态下,链接程序ld在系统的预设路径(如/usr/lib)中需要所需要的库文件,这个选项告诉链接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。
-lname:在链接时,装载名字为"libname.a"的函数库,该函数库位于系统预设的目录或者有-L选项确定的目录下。例如,-lm表示链接名为"linm.a"的数学函数库。(-l是小写的L)
例如:gcc foo.c -L/home/lib -lfoo -o foo
-static:静态链接库文件
例: gcc -static hello.c -o hello
库有动态和静态两种,动态通常用.so为后缀,静态用.awie后缀。
例如:libhello.so libhello.a。当使用静态库时,链接器找出程序所需的函数,然后将他们拷贝到可执行文件,一旦链接成功,静态库也就不再需要了。然而,对动态库而言,就不是这样,动态库会在可执行程序内留下一个标记,指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行链接的缺省操作时首先链接动态库。
-Wall:生成所有警告信息
-w:不生成任何警告信息
-DMACRO:定义MACRO宏,等效于再程序中使用#define MACRO
1-1 编程基础 GCC程序编译的更多相关文章
- linux应用程序设计--GCC程序编译
GCC程序编译 linux系统下的GCC(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作之一.GCC可以在多种硬件平台上编译出可执行程序,其执行效率与一 ...
- 【C编程基础】C编译链接命令gccc
1.gcc安装 rpm -qa|grep gcc ==>检查gcc是否安装 gcc -v ==>检查gcc版本 yum -y install gcc ==>安装gcc 2.基本语法 ...
- [国嵌笔记][012][GCC程序编译]
GCC特点 GCC(GUN C Compiler)是GUN推出的功能强大.性能优越的多平台编译器.其执行效率与一般编译器相比平均效率要高20%~30%. GCC基本用法 gcc [options] f ...
- 1-2 编程基础 GDB程序调试
简介 GDB是GNU发布的一款功能强大的程序调试工具.GDB主要完成下面三个方面的功能: 1.启动被调试程序 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检查程序状态(如变量值). ...
- Linux下C语言编程基础学习记录
VIM的基本使用 LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...
- Android 网络编程基础之简单聊天程序
前一篇讲了Android的网络编程基础,今天写了一个简单的聊天程序分享一下 首先是服务端代码: package com.jiao.socketdemo; import java.io.Buffered ...
- Windows 编程,程序编译使用的命令行工具。
Windows 编程,程序编译使用的命令行工具. 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译为obj文件. 2.rc.exe文件是资源编译器.工程项目中的.rc文件 ...
- gcc 无法编译c17程序解决办法
1.保证将gcc程序升级到7.1以上. 2.如果用命令行手工编译,就多加个参数-std=c++17,例如命令应该是: "g++" -std=c++17 "text.cp ...
- 用gcc/g++编译winsock程序
用gcc/g++编译winsock程序 D:\My\code>gcc -o getweb.exe getweb.c -lwin32socket 如果不加此句 -lwin32socket 编译会报 ...
随机推荐
- 【POJ 3580】 SuperMemo
[题目链接] 点击打开链接 [算法] 本题也是Splay区间操作的模板题,不过要比BZOJ 3223要稍微复杂一些,做完此题后,我终于对Splay有了更深入的理解,有“拨开云雾见青天”的感觉 本题还是 ...
- bzoj2660最多的方案——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2660 首先,多种方案的出现是因为一个较大的斐波那契数可以变成两个较小的: 用一个01串来表示 ...
- Oracle的db.properties文件
转自:https://blog.csdn.net/lssqk/article/details/79133829
- 13_android实现多线程下载_界面实现
进度条这个东西可以给它创建一个布局.进度条叫ProgressBar. ProgressBar这个就是进度条. 默认的安卓进度条是一个圈圈,一圈一圈转. 之前咱们把一个XML文件转化成一个View对象, ...
- Eclipse安装配置Maven
Eclipse安装配置Maven 1 安装配置Maven 1.1 下载Maven 从Apache网站 http://maven.apache.org/ 下载并且解压缩安装Apache Maven. ...
- 简单聊聊ES6-Promise和Async
前言 本篇博文出至于我的github仓库:web-study,如果你觉得对你有帮助欢迎star,你们的点赞是我持续更新的动力,谢谢! 异步编程在前端开发中尤为常见,从最早的XHR,到后来的各种封装aj ...
- J20170414-ms
ストレージ 仓库
- Codeforces - 773A - Success Rate - 二分 - 简单数论
https://codeforces.com/problemset/problem/773/A 一开始二分枚举d,使得(x+d)/(y+d)>=p/q&&x/(y+d)<= ...
- 51nod1432【贪心】
对于每个数我找一个和他相加最接近独木舟,然后ans+=1; 想复杂了,直接两端来就好了. 然后两个相加如果<=m那么就让它们在一起,不是的话就让大的一艘船,然后继续搞(贪心) #include ...
- 3DMAX 合并镜像物体
如果镜像文件是实例,那么就不能用附加选项,所以可以先删除一半,再copy镜像出来,然后点选可编辑网格,在一个物体上选附加,再点选另一半即可