GCC基础知识学习
GCC基础知识学习
一、GCC编译选项解析
常用编译选项
命令格式:gcc [选项] [文件名]
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-c:仅执行编译操作,不进行连接操作;
-o:指定生成的输出文件。
gcc编译的四个阶段(ESc,iso)
1.将hello.c预处理输出hello.i文件。
gcc -E hello.c -o hello.i
查看hello.i内容如下:

2.将预处理输出文件hello.i汇编成hello.s文件。
gcc -S hello.i -o hello.s
查看hello.s内容如下:

3.将汇编输出文件hello.s编译输出hello.o文件。
gcc -c hello.s -o hello.o
查看hello.o内容如下:

4.将编译输出文件hello.o链接成最终可执行文件hello。
gcc hello.o -o hello

- 或直接输入下面代码一步到位
gcc hello.c -o hello
- 当有多个文件需一起编译时,可输入
gcc *.c一起编译。
二、多模块
多个文件一起编译
文件:test_a.c test_b.c
两种编译方法:
1、一起编译
gcc test_a.c test_b.c -o test
2、分别编译各个源文件,之后对编译后输出的目标文件链接
gcc -c test_a.c //生成test_a.o
gcc -c test_b.c //生成test_b.o
gcc -o test_a.o test_b.o -o test
比较:第一种方法编译时需要所有文件重新编译;第二种只重新编译修改的文件,未修改的不用重新编译。
『一个实例:-I参数的使用』
- 使用vim编辑生成相应代码,注意:*.h文件应放入include中, *.c文件应放入src中。

- 编译时若输入
gcc *.c会出现下图错误

- 应输入
gcc -I/头文件所在路径 *.c才能够成功编译

这里我们为之后做题方便,可以输入gcc -I/头文件所在路径 *.c -o main将执行文件命名为main。

- -I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。
三、静态库与动态库
静态函数库
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
动态函数库
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
『一个实例』
- 在上一个实例中有五个.c文件,除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作成一个静态库libmath.a和一个共享库libmath.so,制作完成后如何调用?
我们先来看看静态库libmath.a的制作:
1.输入gcc -c -I/头文件所在路径 add.c sub.c mul.c div.c生成四个.o文件。
2.输入ar rcvs libmath.a add.o sub.o mul.o div.o生成静态库。

3.如果之前已经生成了main,我们可以输入rm main来删掉它,ls一下可以看到没有执行文件了。

再输入gcc main.c -o main -I/头文件所在路径 -L. -lmath,可以看到生成了执行文件main,输入./main就可以实现调用静态库来执行文件了!

- 这里要注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。那么为什么要在math之前加-l呢?这是因为-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名。而-L参数跟着的是库文件所在的目录名。题中的库文件在当前目录,故写为
-L.。
我们再来看看动态库libmath.so的制作:
1.输入gcc -fPIC -c -I/头文件所在路径 add.c sub.c mul.c div.c
2.输入gcc -shared -o libmath.so add.o sub.o mul.o div.o生成动态库。

3.我们来输入gcc -I/头文件所在路径 -o main main.c -L. -lmath后执行一下main试一试,会发现出现下图的错误。

这是为什么呢?原来是找不到动态库文件libmath.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件libmath.so复制到目录/usr/lib中,再试试就可以执行啦!
四、查看帮助文档
通过man gcc查看关于gcc的帮助文档。

GCC基础知识学习的更多相关文章
- (转)Linux基础知识学习
Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过 ...
- Objective-c基础知识学习笔记
Objective-c基础知识学习笔记(一) 一直有记录笔记的习惯.但非常久没分享一些东西了,正好上半年開始学习IOS了,如今有空写点.因开发须要,公司特意为我们配置了几台新MAC.还让我们自学了2周 ...
- GCC 基础知识
目录 GCC 基础知识 一.GCC编译选项解析 二.多模块.多个文件一起编译 三.静态库与动态库 四.查看帮助文档 GCC 基础知识 一.GCC编译选项解析 1. 常用编译选项 命令格式:gcc [选 ...
- AXAJ基础知识学习
AXAJ基础知识学习 博客首页 Ajax简介 ajxa全称是Asynchronous Javascript And XML ,就是异步的JS 和XML 通过Ajax可以再浏览器中向服务器发送异步请求, ...
- Vue2基础知识学习
Vue2基础知识学习 01.初识 new Vue({ el: '#root', //用于指定当前Vue实例为哪个容器服务,值通常为css选择器符 data () { return { } } }); ...
- C#基础知识学习
C#基础知识整理 学习地址:http://blog.csdn.net/column/details/csarp.html
- 韩天峰博客 php基础知识学习记录
http://rango.swoole.com 写好PHP代码真的不容易,给大家几个建议: 慎用全局变量,全局变量不好管理的,会导致你的代码依赖于全局变量,而耦合度太高. 一定不要复制粘贴代码,可重用 ...
- 〖前端开发〗HTML/CSS基础知识学习笔记
经过一天的学习,把慕课网的HTML/CSS基础知识学完了,笔记整理: 1. 文件结构: HTML文件的固定结构: <html> <head>...</head> & ...
- Linq的简介和基础知识学习
学习LINQ之前,我们要知道LINQ是干什么,解决什么问题的,怎样学习? 一.LINQ简介 1.什么是LINQ? 什么是LINQ?LINQ中文翻译为语言集成查询(Language Integrated ...
随机推荐
- eclipse下创建maven项目并部署到tomcat服务器(转)
maven项目部署到服务器有很多方法,可以利用jetty-maven-plugin或者tomcat-maven-plugin,这属于maven的知识点. 通常开发中,需要将项目放在服务器上借助开发工具 ...
- bootstrap之双日历时间段选择控件—daterangepicker(汉化版)
jQuerybootstrapdaterangepicker汉化版 双日历时间段选择插件 — daterangepicker是bootstrap框架后期的一个时间控件,可以设定多个时间段选项,也可以自 ...
- HTTP协议介绍(POST、GET、Content-Type)
什么是HTTP?超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议.HTTP/1.1 协议规定的 HTTP 请求方法 ...
- .net中几个经常用到的字符串的截取
string str="123abc456";int i=3;1 取字符串的前i个字符 str=str.Substring(0,i); // or str=str.Remov ...
- 【Linux系列】Ubuntu ping通,xshell无法连接
现象描述:Ubuntu能Ping通主机,主机也能ping通虚拟机.而且,虚拟机也能上网.只是xshell不能连接. 解决方案: 一:使用管理员身份 设置防火墙. 先查看一下防火墙状态 sudo ufw ...
- Centos7上安装docker及使用scrapy-splash
下载docker https://www.cnblogs.com/yufeng218/p/8370670.html 安装scrapy-splash https://www.cnblogs.com/ ...
- js iterable类型
遍历Array可以采用下标循环,遍历Map和Set就无法使用下标.为了统一集合类型,ES6标准引入了新的iterable类型,Array.Map和Set都属于iterable类型. 具有iterabl ...
- hdu 1558 (线段相交+并查集) Segment set
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐 ...
- hdu 1026(BFS+输出路径) 我要和怪兽决斗
http://acm.hdu.edu.cn/showproblem.php?pid=1026 模拟一个人走迷宫,起点在(0,0)位置,遇到怪兽要和他决斗,决斗时间为那个格子的数字,就是走一个格子花费时 ...
- 如何使用NSDL玩转微信跳一跳
目前网上介绍windows和IOS操作系统上玩微信跳一跳的有很多文章,但介绍Linux平台下的文章相对较少,所以动手操作下和大家分享,同时感谢wangshub在github上的分享: 1 下载wech ...