当前位置: 首页 > article >正文

gcc 编辑器基本使用

简介

gcc是由GNU开发的编程语言编辑器。gcc原本作为GNU操作系统的官方编辑器,现已被大多数类unix操作系统(如linux、BSD、Mac OS X等)采纳为标准的编辑器,gcc同样适用于微软的windows。

一、gcc常用选项

在终端(Ubuntu)输入gcc --help,查看gcc有哪些选项

常用的有:

  • -o <file>        指定生成的输出文件名为file
  • -E                  只进行预处理
  • -S                  只进行预处理和编译
  • -c                  只进行预处理、编译和汇编
  • -v                  查看gcc版本
  • -g                  包含调试信息
  • -On n=0-3     编译优化,n越大优化越多
  • -Wall             提示更多警告信息
  • -D                  编译时定义宏
  • -static           静态连接

不使用任何选项,将文件输出为可执行文件

1、-o -E -S -c选项 的使用

创建一个hello.c的文件进行编辑

文件里写入hello程序,保存退出。

使用gcc -E将hello.c文件预处理,并输出到hello.i文件:

使用gcc -S生成汇编文件,输出到hello.s:

使用gcc -c 生成目标文件,输出到hello.o:

使用gcc不加任何选项生成可执行文件:

执行hello测试:

执行成功。

注意:以上所有中间步骤都可以跳过,

比如:可以让hello.c直接转化为可执行文件

 使用gcc -s 让hello.i文件生成hello1.s

2、gcc对多个.c文件进行编译

如下图,我已经准备好了加减乘除的函数:

加法函数的头文件和.c文件如下:

其他函数类似,在main.c中:

此时便可以使用通配符*,直接输出可执行文件:

二、静态库和动态库

首先简单介绍一下动态库和静态库:

  • 静态库和动态库的载入时间是不一样的。
  • 静态库的代码在编译的过程中已经载入到可执行文件中,所以最后生成的可执行文件相对较大。
  • 动态库的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,所以最后生成的可执行文件相对较小。

(1)静态链接:由链接器在链接时将库的内容加入到可执行程序中。

优点:对运行环境的依赖性较小,具有较好的兼容性

缺点:

  • 生成的程序比较大,需要更多的系统资源,在装入到内存时会消耗更多的时间
  • 库函数有了更新,必须重新编译应用程序

(2)动态链接:链接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序

优点:

  • 在需要的时候才会调入对应的资源函数
  • 简化程序的升级;较小的程序体积
  • 实现进程之间的资源共享(避免重复拷贝)

缺点:

  • 依赖动态库,不能独立运行
  • 动态库依赖版本问题严重
1、静态库
 静态库的创建

静态库的命名(libxxx.a)规则:

  • 前缀:lib
  • 库名称:自己定义(做到见名知其意)
  • 后缀.a

源文件(.h, .c等)需要先进行预编译、编译、汇编,生成目标文件(二进制文件)之后,通过ar工具进行编号、索引、压缩打包,创建成libxxx.a文件(静态库)。ar工具需要添加参数:rcs:

  • r更新
  • c创建
  • s建立索引

使用第一章节的第二小节中的例子,将加减乘除的.c文件用gcc -c生成它们的目标文件(.o)

然后使用rm命令将目标文件打包成.a文件

此时静态库便创建成功!

静态库使用测试

静态库的使用需要依赖文件和所有的头文件,首先把所有的.o和加减乘除的.c函数全部删除,删除之后只有以下文件了:

在上图中,使用了gcc命令生成了可执行文件,并执行成功,说明测试成功了,下面说一下几个选项的作用

  • -I./    指定当前目录。注:这里是小写L
  • -L./    指定库所在的目录
  • -ltest    -l表示指定库的名称,test为静态库的名称(去掉lib和.a)
2、动态库
动态库的创建 

动态库命名(libxxx.so)规则:

  • 前缀:lib
  • 库名称:自己定义
  • 后缀:.so

还是使用上一个例子

第一步:同样需要先生成目标文件,与静态库创建不同的是,需要加入-fpic选项

参数-fpic创建与地址无关的编译程序(pic, positon independent code)

 第二步:生成共享库,加上链接器选项:-shared(指定生成动态链接库)

此时可以通过nm命令查看对应的函数

 动态库使用测试

与静态库测试一样,先删除加减乘除的.o和.c文件

删除之后如下:

尝试先使用与静态库相同的方式生成可执行文件

 发现此时报错,找不到共享对象文件,也就是找不到这个libtest.so,这是因为生成这个可执行文件有个链接器,但是链接器并不知道这个库在这(因为这里使用的是相对路径)。以下为解决方式

1、将库拷贝到标准库文件夹中去(不推荐)

使用sudo cp libtest.so /lib

然后使用gcc命令:

此时并不需要-L指定库所在目录了,我们发现这种方式成功运行了。

2、临时设置环境变量

需要添加绝对路径

这种方式是临时的,也就是退出终端之后再进入之后就不生效了。

3、永久设置

配置~/.bashrc或者/etc/profile,环境变量相关问题可以查找其他相关资料,这里不详细说明了。

4、将其添加到/etc/ld.so.conf文件(链接器的配置文件)中

加入新行-动态库所在的绝对路径

sudo ldconfig -v,该命令会重建/etc/ld.so.cashe文件(使链接器的配置文件生效)

5、使用软连接

将库文件链接到lib文件夹中

http://www.lryc.cn/news/2416921.html

相关文章:

  • pr找不到msvcr110.dll无法执行代码怎么解决?总结7个有效方法分享
  • 析构函数
  • Jquery各版本下载,附Jquery官网下载方法
  • 16进制颜色
  • 详解 LPC
  • 坑逼的PL2303与WIN11
  • 安装天堂遇到的问题及解决方法
  • 两款WiFi无线网络扫描工具软件 WirelessMon Xirrus WiFi Inspector
  • DTM、DEM、DSM与DOM的概念
  • ebook_7种开放式eBook格式指南
  • QGC地面站使用教程
  • BootStrap----table
  • 并发编程之CyclicBarrier详解
  • 【笔记】w5500 官方DHCP库 使用
  • c语言钩子函数
  • 无忧启动源码 仿音速启动
  • 简易钓鱼网站的构建(Kali SetoolKit)
  • UNIX环境高级编程——UNIX基础知识
  • 我的ubuntu8.04安装经验
  • 常见几种浏览器兼容性问题与解决方案
  • Autodesk CAD帮助文档总结二 DXF 概述
  • smb+服务器+修复,Microsoft Windows
  • MySQL如何卸载干净以及下载、安装教程
  • oTree学习教程(七)Apps rounds
  • label设置自动换行的方法
  • HI3516DV300笔记(二)硬件适配
  • 单目3D检测新SOTA!PersDet:透视BEV中进行3D目标检测
  • 游戏开发博客
  • [转载]聊聊tcpdump与Wireshark抓包分析
  • C++实现刷屏代码(详细教程+代码)