个人Linux操作系统学习笔记2 - gcc与库的理解

配置vim

bash 复制代码
$ curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

gcc

gcc code.c

生成可执行文件,但是名称是a.out
gcc code.c -o code.exe
-o 意味着重命名
gcc -E code.c -o code.i

预处理为.i文件,并保存到code.i文件
为什么有条件编译这个功能?

例:软件的免费版和付费版

例:防止头文件被重复包含

c 复制代码
#ifndef __CODE_H__
#define __CODE_H__
//code
#endif

gcc -S code.i -o code.s

从C语言文件翻译成为汇编语言
gcc -c code.s -o code.o

把编译语言翻译为二进制文件 (.o可重定位目标二进制文件)
gcc code.o -o code

进行链接,生成可执行文件
-ESc .iso

其它选项

gcc code.c -o code -Wall

(-warning all)

把编译过程中的报错全部打印显示

如何理解库

静态库 动态库
Linux .a .so
Windows .lib .dll
Linux下的命名规则:libname.so
真实名字是name
例如libc-2.17.so是c标准库2.17版本
使用ldd命令查看依赖库
bash 复制代码
$ ldd code.exe 
    linux-vdso.so.1 =>  (0x00007fff7d9a9000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fc2277eb000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc227bb9000)

什么是动静态库?

动态链接:链接的是关联关系,更改的地址是库地址

一旦库缺失,所有相关程序都无法运行!

把程序需要的库中的方法直接拷贝到程序中,叫做静态链接

动态库(共享库) 静态库
文件后缀 .so .a
链接方式 动态链接 静态链接
优点 节省内存空间 不需要库跳转;编译完成后不再依赖库
缺点 速度慢;编译完成后依旧依赖动态库 可执行程序体积较大,消耗内存资源
结论一:gcc编译默认采用动态链接
日常开发也推荐使用动态库和动态链接
bash 复制代码
$ file code
code: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=9398bb16eaf5490d0c7b660b2f307da66a39cd3f, not stripped

如果想要使用静态链接:

  1. 需要安装静态库(默认没装)
  2. 使用gcc code.c -o code -static
bash 复制代码
-rwxrwxr-x 1    8440 Dec 14 16:38 code
-rw-rw-r-- 1     599 Dec  4 14:02 code.c
-rwxrwxr-x 1  861288 Dec 14 16:41 code-static

明显静态链接的体积更大

bash 复制代码
$ file code
code: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=9398bb16eaf5490d0c7b660b2f307da66a39cd3f, not stripped
$ file code-static 
code-static: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=86dde6cc4cb8144173b2edd95e56ab6207efdcb2, not stripped
相关推荐
无人生还别怕12 分钟前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
Gnevergiveup21 分钟前
ATT&CK红蓝对抗实战指南-Windows安全基础
笔记·网络安全
企鹅侠客1 小时前
Linux CPU 负载平均值(Load Average)详解:从原理到实践
linux·运维·服务器·服务器负载
adinnet20261 小时前
电商客服对话知识库的自学习闭环与质量演进机制
学习
易点云徐源1 小时前
HP 暗影精灵 PRO 16 安装双系统后,开机直接进入 Windows,按 F9 才能进入 Ubuntu:GRUB 菜单不显示的处理方法
linux·运维·ubuntu
第404号工位2 小时前
离职退电脑前别只点“清空回收站”!手把手教你彻底抹除凭证与数字痕迹
linux·python·架构
lazy H2 小时前
【计算机网络】第 13 篇:NAT 和端口映射是什么?为什么本地服务外网访问不了?
java·网络·网络协议·学习·计算机网络·408
就像楞次定律2 小时前
【Linux 学习记之二】C++ 构建体系与底层链接机制的深度透视(1)
linux·后端
米优2 小时前
linux下获取崩溃程序的core文件
linux·运维·服务器
qeen872 小时前
【Linux】动静态库的制作使用及ELF文件的宏观理解
linux·运维·库