个人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
相关推荐
AlfredZhao18 小时前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
小宇子2B20 小时前
三、内核入口 el0_svc / entry_SYSCALL_64 的汇编做了什么——从异常向量到 C 函数
操作系统
小宇子2B1 天前
四、从 write(1, "hello", 5) 到 ksys_write() —— sys_call_table 怎么路由的
操作系统
小宇子2B1 天前
一、printf("hello") 怎么变成 write(1, "hello", 5) —— libc 的 stdout 缓冲机制
操作系统
戴为沐2 天前
Linux内存扩容指南
linux
zylyehuo2 天前
Linux 彻底且安全地删除文件
linux
用户805533698033 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297913 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
Web3探索者5 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo5 天前
Linux系统中网线与USB网络共享冲突
linux