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 ...
随机推荐
- xshell实时跟踪日志与中文乱码设置
1.实时跟踪日志命令 tail -f logName.log 动态查看名为logName的日志信息 ctrl+c 退出实时跟踪 2.中文乱码设置 在Xshell.putty.SSH Secure Sh ...
- 修复python命令行下接收不到参数的问题
由于之前安装过多个python版本,导致出现了在命令行下直接给py文件传递参数的时候接收不到,即使重新卸载安装也没有解决. 解决办法: 修改如下图路径下的键值为:"D:\Python27\p ...
- vue缓存之keep-alive,设置想要缓存的页面
由于项目需求从a页面跳转到b页面,返回a页面,a页面数据不能被刷新掉,方法很多列举12 方法1 a页面通过学期按钮切换学期,该学期里more进入b页面,返回a页面,返回回到对应a页面进入的高亮按钮设置 ...
- python subprocess 小例子
#服务端import socketimport osimport subprocessphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ...
- python 验证码 和进度条
import random def make_code(n): res='' for i in range(n): s1=chr(random.randint(65,90)) s2=str(rando ...
- Linux_(1)基本命令(上)
一.基本命令1.我是谁 whoami --who am i2.谁在线 who w3.显示当前路径(定位) pwd4.切换目录 cd ~返回主目录 cd ..返回上一级目录5.查看某个目录中的子目录和文 ...
- Android开发之自定义Toast(带详细注释)
因为工作需求,所以自己研究了自定义Toast,这里做出总结: 在此之前有一点需要提前说明:Toast与其他组件一样,都属于UI界面中的内容,因此在子线程中无法使用Toast弹出提示内容,如果强行在子线 ...
- Python.URLs
1. The Future of Asynchronous IO in Python https://medium.com/@paulcolomiets/the-future-of-asynchron ...
- You have more than one version of ‘org.apache.commons.logging.Log’ visible, which is not allowed问题解决
https://zeroturnaround.com/forums/topic/jrebel-reports-more-than-one-version-of-org-apache-commons-l ...
- Codeforces 749C. Voting 模拟题
C. Voting time limit per test: 1 second memory limit per test: 256 megabytes input: standard input o ...