Linux常用基础(三)
1、gcc编译器
(1)简介
前期的GCC是GNU C Compiler,仅仅用于C语言的编译,经过多年的发展,现在的GCC为GNU Compiler Collection,并且目前支持多种编程语言的编译。
(2)gcc的编译过程
gcc的编译过程包括了四个过程,分别是预处理、编译、汇编和链接,如下所示:
1)预处理
主要是完成头文件的展开,c文件中宏的替换展开,去掉有关的注释。
命令:gcc -E myapp.c -o myapp.i
-E:生成预处理的文件
-o:生成目标文件
2)编译
预处理后的文件仍然是c文件,编译的过程是把c文件编译成汇编文件。
命令:gcc -S myapp.i -o myapp.s
-S:生成汇编文件
3)汇编
将汇编文件变成二进制文件。
命令:gcc -c myapp.s -o myapp.o
-c:编译子程序
4)链接
将相关的函数库链接到目标文件中去,最终生成可执行文件。
命令:gcc myapp.o -o myapp
(3)其它命令参数
1)查看gcc版本号:-v / --version
2)指定头文件目录:-I + 目录
3)编译时定义宏:-D
4)编译优化:-On (n=0-3:当n为0不优化,当n为3优化级别最高)
5)提示更多的警告信息:-Wall
6)包含调试信息:-g (GDB调试需要加此参数)
2、静态库
(1)命名规则
1)lib + 库的名字 + .a
2)例如:libmytest.a(库的名字为mytest)
(2)制作步骤
1)生成对应的.o文件,编译时添加-c参数
命令:gcc mytest.c -c
2)将生成的.o文件打包
命令:ar rcs + 静态库的名字(libmytest.a)+ 生成的所有.o文件
(3)发布和使用静态库
1)将打包好的lib和头文件发布出去,头文件提供API接口的相关信息
2)静态库使用方法
命令1:gcc main.c -I + 头文件路径lib/libmytest.a -o myapp
命令2:gcc main.c -I + 头文件 -L + 库的路径 -l + 库的名字 -o myapp
(4)优缺点
优点:
1)发布程序的时候,不需要提供相应的库
2)加载库的速度快
缺点:
1)库被打包到应用程序中,导致应用程序的体积很大
2)一旦库发生了变化,则应用程序需要重新编译
3、共享库(动态库)
(1)命名规则
1)lib + 库的名字 + .so
2)例如:libmytest.so
(2)制作步骤
1)生成与位置无关的代码(生成与位置无关的.o文件)
命令:gcc -fPIC -c *.c -I + 头文件路径
2)将.o打包成共享库(动态库)
命令:gcc -shared -o libmyapp.so *.o -I 头文件路径
(3)发布和使用共享库
发布:将.so文件和头文件进行发布
使用:
命令1:gcc main.c lib/libmyapp.so -o myapp -I 头文件路径
命令2:gcc main.c -I + 头文件路径 -L + 库的路径文件 -l + 库的名字 -o myapp
(4)程序执行时动态库无法被加载的问题解决
原因:环境变量中找不到动态库的路径,程序运行时链接不成功
解决:
1)将动态库拷贝到路径/lib中去(不允许使用)
2)将动态库路径添加到额外的链接环境变量LD_LIBRARY_PATH
命令:export LD_LIBRARY_PATH=./lib(动态库的路径)
3)将LD_LIBRARY_PATH永久改变
修改~/.bashrc配置文件,在文件最后export
4)通过修改动态连接器的配置文件
1)需要找到动态链接器的配置文件
命令:ls -l /etc/ld.so.conf
2)动态库的路径写入到配置文件中
命令:vim /etc/ld.so.conf
3)将动态库的路径添加到最后一行,然后保存退出vim
4)更新链接配置文件
命令:sudo ldconfig -v
(5)优缺点
优点:
1)应用程序的体积小
2)动态库更新,不一定需要重新编译应用程序
缺点:
1)发布程序的时候,需要发布动态库给用户
2)动态库并没有打包到应用程序中去,加载速度相对较慢
Linux常用基础(三)的更多相关文章
- Linux常用基础命令(二)
Linux常用基础命令 一.-ls--列表显示目录内容 二.-alias--设置别名 三.-du--统计目录及文件空间占用情况 四.-mkdir--创建新目录 五.-touch--创建空文件 六.-l ...
- Linux常用基础命令整理:关机命令、查看目录下文件命令等
Linux常用基础命令整理:关机命令.查看目录下文件命令等 整理了一些Linux常用基础命令,欢迎指正. 首先记住四个热键,学会这四个键,收益一辈子. Tab按键---命令补齐功能Ctrl+c按键-- ...
- linux常用命令三
linux常用命令三 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 ...
- Linux常用指令(三)
进入京东运维组实习,收到了很多同事的热心指导,自己也努力学习,按照他们给出的学习计划,真的很充实,学到了很多不只是开发方面的知识. 以下简单记录下自己的笔记,方便以后查阅. 1.文件系统 Linux系 ...
- Linux常用基础指令
Linux常用指令 一.基础命令 whoami查看当前用户 pwd查看当前所在位置 ls 查看当前文件夹的内容 ls -l或ll显示详细内容 cd 绝对路径:从根目录开始的路径 cd / 文件夹 返回 ...
- Linux常用基础命令三
一.ln 软链接 软链接也称为符号链接,类似于 windows 里的快捷方式,有自己的数据块,主要存放 了链接其他文件的路径. 在查看文件目录中,软连接是以'l'开头 创建软链接 ln -s [原文件 ...
- 前后端同学,必会的Linux常用基础命令
无论是前端还是后端同学,一些常用的linux命令还是必须要掌握的.发布版本.查看日志等等都会用到.以下是我简单的总结了一些简单又常用的命令,欢迎大家补充.希望能帮助到大家 本文首发于公众号 程序员共成 ...
- Linux入门基础(三):Linux用户及权限基础
用户基础 用户和组 每个用户都拥有一个userid 每个用户都属于一个主组,属于一个或多个附属组 每个组拥有一个groupid 每个进程以一个用户身份运行,受该用户可访问资源限制 每个可登陆用户拥有一 ...
- Linux常用的三种软件安装方式
一:Linux源码安装 1.解压源码包文件 源码包通常会使用tar工具归档然后使用gunzip或bzip2进行压缩,后缀格式会分别为.tar.gz与.tar.bz2,分别的解压方式: ...
随机推荐
- Mark: 如何用Haskell写一个简单的编译器
作者:aaaron7 链接:https://www.zhihu.com/question/36756224/answer/88530013 如果是用 Haskell 的话,三篇文章足矣. prereq ...
- LiveBOS Webservice初步使用
今天外部部门对接,需要我们这传输数据到他们的webservice,因为我是php的,他们java的demo没有参考意义,因此自己摸索着请求. 我使用的是php的扩展方法soap,首先new SoapC ...
- ios证书制作与上架指南
项目开发完了,要上架 ios AppStore 记录一下经过,以及需要提前准备和预防的东西,以便下次省心! 一.首先要申请开发者账号: 账号按流程注册申请,当时申请了够10遍,总结以下经验: 1.申请 ...
- 如何修改被readonly修饰的属性
结论: 1.用KVC改变只读属性的值: 2.若禁止KVC方式修改只读属性的值,可在对应类重写类方法 // 该方法默认返回YES. 即在不存在满足条件的存取方法时,允许直接访问属性对应的实例变量+ (B ...
- 关于如何修改一张表中所有行与选定字段的同sql多行语句的添加方法
利用Excel以及word文档进行操作 将表的字段以及数据全部放入Excel表中并保存. 在word表中将写好的sql语句放入文档,利用邮件--选择收件人--使用现有列表--(选择之前做好的Excel ...
- 利用 FluentScheduler 启动定时器计划任务
FluentScheduler 是什么? Automated job scheduler with fluent interface. 这是作者在 Github 上的介绍,就是一个定时任务管理器.在 ...
- 【目录】Jmeter系列
为天地立心,为生民立命.为往圣继绝学,为万世开太平. ---<横渠四句>·张载 Jmeter(一)简介以及环境搭建 Jmeter(二)Jmeter目录介绍 Jmeter(三)Test-Pl ...
- The 2016 ACM-ICPC Asia China-Final L World Cup(深搜+回溯 暴力求解)
题目分析: 对于A,B,C,D四支队伍,两两之间进行一场比赛,获胜得3分,平局得1分,失败不得分,现在对给出的四个队伍的得分,判断能否满足得到这种分数,且方案唯一输出yes,不唯一输出no,不可能则输 ...
- SpringBoot整合自定义FTP文件连接池
说明:通过GenericObjectPool实现的FTP连接池,记录一下以供以后使用环境:JDK版本1.8框架 :springboot2.1文件服务器: Serv-U1.引入依赖 <!--ftp ...
- nginx 其他配置语法
1.nginx 缓冲区配置 2.跳转重定向 3.头信息 4.超时 location / { proxy_pass http://127.0.0.1:8080;(代理跳转url) proxy_redir ...