个人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
相关推荐
2401_8685347810 小时前
数仓开发落地手册
linux·运维
正在走向自律11 小时前
使用atop工具监控Linux系统指标
linux·运维·php·实时监控·atop分析内存
云深处@12 小时前
【数据库】MySQL 入门
数据库·学习·mysql
果果燕12 小时前
实习笔记(一):NFS、Samba、VNC、Git、CMake、systemd、内核、交叉编译
linux·arm开发·c++·笔记·git
HyperAI超神经12 小时前
【vLLM 学习】Disaggregated Prefill
人工智能·深度学习·学习·vllm
天吾cc12 小时前
RTT-IO设备模型
单片机·嵌入式硬件·学习
美味蛋炒饭.13 小时前
Git 版本控制(下)
开发语言·git·学习·总结·后端开发
yyy(十一月限定版)13 小时前
017【入门】最小栈
linux·运维·服务器
呼噜想睡觉13 小时前
Bootstrap 组件之响应式导航条实现
学习
不负岁月无痕13 小时前
简单理解操作系统结构
java·linux·c语言·开发语言·c++·面试