使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...
转载自:http://daimajishu.iteye.com/blog/1089740
对gcc认识的一篇文章,就转载了,截取了自己感兴趣部分。
一,GCC编译器简介
虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。 gcc 是一套完整的编译工具。
GCC是Linux平台下常用的编译链接器。编译链接的过程分为:
源代码-->预处理文件(.i)-->编译后的汇编代码(.s)-->汇编后的二进制文件(.o)-->链接后的二进制物件(无后缀)。
处理程序分别是 :cpp、ccl、as、ld。
使用 -v选项,可以看到各个阶段关联的处理程序。
使用gcc -E 指示gcc对源代码进行预处理,结果直接输出到终端。
使用gcc -S 指示gcc编译成为汇编语言
使用gcc -c 指示gcc直至形成二进制文件(不进行链接)
使用gcc 指示gcc链接形成二进制物件(多个二进制模块链接形成大的模块或者可执行程序)
因此你需要的目标文件的种类是 -E、-S、-c或者不带这些参数确定的,
源文件可以是中间文件的一种。-o参数控制的仅仅是输出文件的名称。
但是gcc默认会根据源文件的后缀去判断应该调用处理程序的那些。例如源文件的后缀是.c,则gcc -E使用的是cpp,gcc -c则使用cpp、ccl、as。如果源文件的后缀是.o,则gcc -E 是无法进行的,会报错:linker input file unused because linking not done。这是gcc发现这个应该进行链接,但是选项指示不使用linker程序,因而报这种错误信息。如果源文件是二进制的文件,但是保存的源文件后缀却是.c,则gcc会当作这是.c文件,如果采用gcc不带参数,则gcc会很多错,因为它把这个文件当作源代码处理的。
注意:这里,源文件指的是gcc的输入文件,源代码指的是程序源代码文件。
以下是使用gcc 不带-E、-S、-c这些参数时,将会进行的处理与输入文件后缀(类型)的对应关系。
使用-save-temps可以保存编译各个阶段的临时文件。
后缀名
种类说明
源文件相应的后续处理
预处理
编译
汇编
链接
.c
C 语言 源程序
○
○
○
○
.C/.cc/.cxx
C++ 语言 源程序
○
○
○
○
.h
源程序所包含的头文件
--
--
--
--
.i
经过预处理的 C 源程序
○
○
○
.ii
经过预处理的 C++ 源程序
○
○
○
.s
汇编语言源程序
○
○
.S
汇编语言源程序
○
○
○
.o
目标文件
○
.a
由目标文件构成的档案文件
○
二,GCC常用编译选项
格式为:
gcc [option | filename] .......
gcc的命令可以分为如下几类:
1,全局选项 -c,-S,-E ,-o
2,目录选项 -Ipath,-Lpath
3,链接选项 -shared,-llibrary -Wl option
4,警告选项 -Wall, -Wextra,-Wconversion,-Wshardow,-Wcast-qual
5,调试选项 -g ,-ggdb
6,优化选项 -O, -O0,-O1,-O2,-O3
7,其它选项 -fPIC
部分选项简介:
-Wl,option : 传递 option 给链接程序
-Wl,-Bstatic : 明确限定链接静态库 ( 链接程序将不再接受动态链接库,直到再次指定 -Bdynamic)
-Wl,-Bdynamic : 明确限定链接动态库
-fPIC :生成动态链接用位置无关代码 (Position-independent code)
-shared : 生成动态链接目标文件
-L :指定链接阶段链接库所在路径
-l : 指定要链接的库(原库名去除前缀 “ lib ” 和后缀 “ .a/.so ” 的剩余部分)
1,创建动态库 :
1)gcc -fPIC -c -o test.o test.c
-fPIC表示产生位置无关代码(position independence code),
-c表示产生的是二进制文件,不进行链接,
-o表示产生的文件名。
2)gcc -shared -o libtest.so test.o
使用1)中编译的二进制文件,产生动态库
2,使用动态库
gcc -o main mian.c -L. -ltest
使用链接的库文件在前目录,名字为test。
3,创建静态库
1)gcc -c -o test.o test.c
-c表示产生的是二进制文件,不进行链接,
-o表示产生的文件名。
2)ar rcs libtest.a test.o
使用1)的二进制文件,产生静态库(文档文件)
4,使用静态库
gcc -o main main.c -L. -ltest
使用链接的库文件在当前目录,名字为test。
使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...相关推荐
- 程序猿二三事之工具使用-Eclipse调试Java常用功能介绍
[ TOC ] 调试常用功能介绍 日常java开发中实际写代码的时间并不会很多,花在整理思路,代码重构,调试bug会占用很大部分时间. 熟练掌握调试工具,了解调试相关技巧,是java开发中减少调试时间 ...
- 在ubuntu系统下使用gcc和makefile实现c语言程序的编译运行
目录 前言 一.使用gcc命令完成编译c语言程序 1.编写c语言程序 main1.c sub1.h sub1.c 2.gcc命令编译 步骤一命令:gcc -c sub1.c作用:将sub1.c程序转换 ...
- Ubuntu中cc++语言简单程序编写以及使用gccg++方式编译简单程序(基础)
Ubuntu中c/c++语言简单程序编写以及使用gcc/g++方式编译简单程序(基础) 这里写目录标题 Ubuntu中c/c++语言简单程序编写以及使用gcc/g++方式编译简单程序(基础) 一.编写 ...
- 理解C语言(零) 导读(上):C程序的编译过程- 机器级表示
1 从Hello world说起 Hello world是初学者使用任何一项编程语言最基本最简单的程序.下面是一个C语言版的"Helloworld" : #include < ...
- c语言编辑编译链接,C语言的“编译、链接”
我们写的代码,仅仅是文本文件(txt),不管后缀怎么变,终究是文本文件,计算机只能显示,不能做事(执行). 文本文件通过"编译.链接",成为可执行文件(windows下是exe): ...
- c语言程序能在android,android环境下编译并运行C语言程序
我的环境: Ubuntu12.04 Android2.2 这里的C语言程序指的是运行与android系统的Linux内核上程序,目前为止有两种方法:第一种是自动编译,第二种是手动编译.这两种方法适用于 ...
- VC如何在编译链接程序过程中在输出窗口看到链接的顺序
VC如何在编译链接程序过程中在输出窗口看到链接的顺序 具体操作:选择VC菜单Project->Settings->Link页,然后在Project Options的Edit栏中输入/ver ...
- c语言程序可以单独编译,c语言中的函数可不可以单独进行编译?_后端开发
在C语言中,要求参加运算的数必须是整数的运算符是什么_后端开发 在C语言中要求参加运算的数必须是整数的运算符是"%":"%"符号在c语言中有两种释义,一是求余符 ...
- Linux 下编译并运行C语言程序
Linux下编译并运行C语言程序 ,以Centos 系统为例 1>新建一个hello.c文件 可以直接用图形用户界面新建也可以使用命令新建. 用命令行的话,要用到Linux下的vi编辑器的相关命 ...
最新文章
- 服务器监控--cacti中英文版安装全解
- CMakeLists
- 阿里CEO张勇放话,90%产品岗将由技术产生,不懂技术的产品人被out了吗?
- mass Framework在后端的核心模块
- 端口转发与代理工具 内网代理 内网反弹代理
- 超市买苹果变量的定义和使用
- PixiJS - 基于 WebGL 的超快 HTML5 2D 渲染引擎
- linux 命令行域名的解析(DNS) —— dig、host
- vue.js 事件的案例以及 v-model 的学习
- redis的发布和订阅
- hibernate教程笔记5
- 3使用技巧_盆栽金钱树,平时使用“3个”技巧,叶子稠密、基部冒新芽
- 搭建邮件系统,采用sendmail+dovecot+openwebmail架构
- 软件安全实验——lab10(一、基于时间的侧信道攻击)
- 公用计算机不使用键盘鼠标,鼠标键盘同时不能用了怎么回事_电脑的键盘和鼠标不能同时用如何解决...
- ADS1256实现轮询
- 《莎士比亚》文本生成
- 5分钟破解WEP加密的无线密码
- 练习4.圆中四只鸭子在同一个半圆的概率——MATLAB
- Cg学习记录003 之Varying参数
热门文章
- iphone 5\6\6p各尺寸参照图
- 《uni-app》一个非canvas的飞机对战小游戏实现(一)准备
- 复旦团队“人体经络图”火了!耗时9年,证明茶可疏通经络,网友:啊这都可以发论文...
- 微信小程序 滑块视图容器
- java游戏项目分享,适合的零基础java项目,提高你的代码能力
- 一组简洁的美食网站设计
- 沃尔玛logo_刮沃尔玛商店的位置
- 电脑键盘部分按键失灵_电脑键盘失灵个别字母不灵怎么办 键盘失灵解决方法...
- 样本数据去标识化技术
- mysql er图怎么画_mysqlworkbench画er图