前言

接上篇,继续学习基本工具。

三、gcc

是什么

Linux下的C语言编译器(C++的编译器是g++,用法选项基本一样)。

既然是编译器,我们就再来加点餐……

链接其实分为两种类型:静态链接和动态链接,分别需要静态库和动态库。


加餐

动态链接

编译期间什么都不做,准备执行时,通过链接文件,将动态库载入内存。

  • 外部库变化影响程序
  • 可执行程序小

静态链接

编译期间把静态库的代码拷贝一份,编译完库就在可执行文件中。

  • 外部库变化不影响程序
  • 可执行程序大(重复包含更是十分冗余)

动态库

.so为后缀,程序准备运行时加载。

静态库

.a为后缀,程序编译时拷贝。

函数库名称

Linux下库的命名

动态库:libXXX.so

静态库:libYYY.a

去掉前缀"lib"和后缀".so"/".a"就是库名。

*windows下,动态库:.dll,静态库:.lib


怎么用

  • -E:编译,预处理完停下,可-o指定生成.i文件
  • -S:编译,汇编完停下,可-o指定生成.s文件
  • -c:编译,链接完停下,可-o指定生成.o文件
  • -o:编译,指定生成目标文件(直接-o生成可执行文件)
  • -std=c99:指定c99标准

首先看一下怎么在Linux上编译并运行一段代码:

[bacon@VM-12-5-centos 2-vim]$ cat test.c
#include <stdio.h>#define NUM(n) n int main()
{//1111//2222//3333printf("hello vim %d\n",NUM(1));printf("hello vim %d\n",NUM(2));printf("hello vim %d\n",NUM(3));return 0;
}
[bacon@VM-12-5-centos 2-vim]$ gcc test.c -o test
[bacon@VM-12-5-centos 2-vim]$ ls
test  test.c

有了可执行程序,如何执行呢?

“./ + 可执行程序名”,找到路径即可执行。

[bacon@VM-12-5-centos 2-vim]$ ./test
hello vim 1
hello vim 2
hello vim 3

那我们如何知道可执行程序是动态链接还是静态链接呢?

file [文件]

[bacon@VM-12-5-centos 2-vim]$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=896e927d85e4e51f3f11ab910c017db042736fbf, not stripped

能够知道:Linux默认选择动态动态链接。

我们还能查看它依赖的动态库——ldd [文件]

[bacon@VM-12-5-centos 2-vim]$ ldd testlinux-vdso.so.1 =>  (0x00007fffe77c2000)libc.so.6 => /lib64/libc.so.6 (0x00007fc7e976f000)/lib64/ld-linux-x86-64.so.2 (0x00007fc7e9b3d000)

我们去掉 “libc.so.6 => /lib64/libc.so.6 (0x00007fc7e976f000)” 的"lib"和后缀:c。

这就是c库。"0x00007fc7e976f000"就是我们依赖(需要)部分的起始位置。

[bacon@VM-12-5-centos 2-vim]$ ls -l /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Jul 25 16:58 /lib64/libc.so.6 -> libc-2.17.so
[bacon@VM-12-5-centos 2-vim]$ ls -l /lib64/libc-2.17.so
-rwxr-xr-x 1 root root 2156592 May 19  2022 /lib64/libc-2.17.so

原来,所谓"libc.so.6"是链接文件,链接到libc-2.17.so这个库,库的大小也能看到。

但,我们若有很多个程序都用这个动态库,不还是有很多份?

并没有,动态库只加载需要的部分,而且是共享的,所以也叫共享库。

如果我们想静态链接呢?

gcc -static

[bacon@VM-12-5-centos 2-vim]$ gcc test.c -static -o test_static
[bacon@VM-12-5-centos 2-vim]$ ll
total 2
-rwxrwxr-x 1 bacon bacon   8360 Dec  1 08:17 test
-rwxrwxr-x 1 bacon bacon 861216 Dec  1 14:55 test_static
[bacon@VM-12-5-centos 2-vim]$ file test_static
test_static: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=41f78cd6e97888d4295faa223090fd1d406097a3, not stripped

文件大小直接是百倍差距了。

*系统默认带动态库(系统运行需要它——Linux大部分指令是C写的),但不一定有静态库(可能需要自己安装)。

[bacon@VM-12-5-centos 2-vim]$ ls /usr/bin/which
/usr/bin/which
[bacon@VM-12-5-centos 2-vim]$ ldd /usr/bin/whichlinux-vdso.so.1 =>  (0x00007ffd21fae000)libc.so.6 => /lib64/libc.so.6 (0x00007f8c708f8000)/lib64/ld-linux-x86-64.so.2 (0x00007f8c70cc6000

到这我们也能知道,系统为了支持我们编程,提供了动静态库(定义)和其.h文件(声明)。所以,

我的代码 + 库的代码(链接.lib和.o文件) = 可执行程序。


接下来,我们用gcc的选项一步步看程序编译的过程

-E 生成.i文件

[bacon@VM-12-5-centos 2-vim]$ ls
test.c
[bacon@VM-12-5-centos 2-vim]$ gcc test.c -E -o test.i
[bacon@VM-12-5-centos 2-vim]$ ls
test.c  test.i
[bacon@VM-12-5-centos 2-vim]$ vim test.i

-S 生成.s文件

[bacon@VM-12-5-centos 2-vim]$ gcc test.c -S -o test.s
[bacon@VM-12-5-centos 2-vim]$ vim test.s

-c 生成.o文件

[bacon@VM-12-5-centos 2-vim]$ gcc test.c -c -o test.o
[bacon@VM-12-5-centos 2-vim]$ vim test.o

以上是对于编译型语言,而对于解释型语言的一种运行方法:编辑完成后,给文件加上可执行属性就可以"./ filename"运行


今天的分享就到这里啦

这里是培根的blog,期待与你共同进步,下期见!

【Linux03-基本工具之GCC】Linux下的C语言编译器相关推荐

  1. Third Week :Linux下的C语言

    Linux下的C语言 1. 搭建C语言开发环境/运行环境 1. 文本编辑 2. 编译器 3. 头文件和系统预装文件 4. make 工具 5. echo 2. 标准输入流/输出流/错误流 1. 重定向 ...

  2. 在Linux下开发多语言软件: Hello GetText!

    在Linux下开发多语言软件: Hello GetText! 转自:http://www.groad.net/bbs/read.php?tid-906.html 开发多语言软件是一件非常困难的事,各个 ...

  3. 第4章 Linux下的C语言开发基础

    第4章 Linux下的C语言开发基础 4.1 C语言开发的基本步骤 C语言源程序开发的基本步骤如下: 根据项目需求划分功能模块 编辑.利用文本编辑器vi或gedit编写C源程序并保存,文件的后缀为.c ...

  4. linux下的C语言开发

    在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...

  5. 在Linux下运行C语言程序

    市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图).CentOS.Fedora. 我以Fedora 2 ...

  6. 怎么用centos7运行c语言程序_在Linux下运行C语言程序

    市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图).CentOS.Fedora. 我以Fedora 2 ...

  7. c语言在linux下运行程序设计,如何在Linux下运行C语言程序

    如何在Linux下运行C语言程序 C语言是一个有结构化程序设计.具有变量作用域(variable scope)以及递归功能的过程式语言.以下是小编为大家搜索整理的如何在Linux下运行C语言程序,希望 ...

  8. deepin终端编译c程序_大神支招 如何在Linux下运行C语言程序

    刚入门学习C语言程序的小伙伴比较常遇到的其中一个问题是:如何在Linux下运行C语言程序.今天针对这个热门问题,小编为大家准备了详细的教程! 小编先给大家普及一些关于C语言程序的基本常识:首先大家要清 ...

  9. Mysql —— linux下使用c语言访问mySql数据库

    示例1: #include<stdio.h> #include<mysql.h> int main() { MYSQL mysql; mysql_init(&mysql ...

最新文章

  1. 【心情】为什么发英文版免责声明?
  2. linux cut的用法
  3. icecandidate事件
  4. php 微信表情存储,emoji表情存储到数据库的方法
  5. 数学物理方法pdf_3位物理学家意外发现基础数学新方法,数学天才陶哲轩:我开始压根不相信...
  6. 翻书法记忆GRE词汇
  7. 用python 数据分析,有推荐的书籍或资料吗?
  8. 猫推荐算法大赛Top 9团队
  9. java吞食天地中武将_在FC吞食天地2里面,哪些武将的基础属性出乎玩家预料
  10. 如何判断建设用地是否符合土地利用总体规划?
  11. java memcached incr_Redis与Memcached的incr/decr差异对比
  12. Citric I 模拟赛心得
  13. dw怎么在框架中加入网页_如何在Dreamweaver中创建框架结构? dw设置框架结构的教程...
  14. TD-LTE获奖:守望5G 引领全球
  15. org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.ljw
  16. C++ 小游戏 井字棋
  17. 架设虚拟环境下的传真服务器
  18. mysql 注入 修改密码_HDWIKI最新版Update注入可修改管理员密码(MYSQL进制技巧)
  19. 浅析TVS管的分类及选型的注意事项
  20. 什么叫 “雪碧图”?

热门文章

  1. 【深度学习】:非极大值抑制(NMS)详解
  2. C#从windows剪贴板粘贴内容的代码
  3. 如何在读卡器中增加SAM
  4. 汇编语言程序设计实验报告三
  5. elastic-job 定时任务集成
  6. webpack:url-loader打包后找不到图片、字体路径问题
  7. Java学习心得体会
  8. mysql 博客建表语句,mysql建表语句
  9. 5.15日 搭建青龙面板教程——狗东跑跑跑~
  10. 使用psftp向服务器上传文件