个人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_858286118 分钟前
OS79.【Linux】POSIX信号量
linux·运维·服务器
万岳科技系统开发43 分钟前
智慧医院小程序开发满足医疗机构多场景服务需求
数据库·学习·小程序
CodingPioneer1 小时前
03零刻Pro-LS2K3000-Loongnix 20.7.rc1硬盘分区、格式化、挂载与卸载
linux·运维·服务器·硬盘挂载
笑鸿的学习笔记1 小时前
C++笔记之内存映射、零拷贝与共享内存(学习三)-操作系统术语概念图
笔记·学习
ShineWinsu1 小时前
对于Linux:TCPsocket编程基础的解析
linux·网络协议·tcp/ip·面试·笔试·进程·远程指令
dddwjzx1 小时前
嵌入式Linux C应用编程——tslib库的使用
linux·嵌入式
Huangjin007_1 小时前
【Linux 系统篇(三)】入门基础指令详解(三)
linux·服务器
既然如此,那就开摆1 小时前
ULIP总结
笔记·学习
言乐61 小时前
Python实现基本搜索引擎
java·linux·开发语言·python·搜索引擎
鱼7331 小时前
同步与互斥(3)--信号量机制
操作系统