个人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
相关推荐
逸模4 小时前
告别熬夜手工整理台账,逸模智能归集实现项目数据自动化存档
大数据·运维·人工智能·笔记·其他·信息可视化·自动化
人间乄惊鸿客5 小时前
Linux所遇问题自记录
linux
Frostnova丶5 小时前
【算法笔记】数学知识
笔记·算法
xqqxqxxq5 小时前
哈希表(HashMap)技术学习笔记
笔记·学习·散列表
生而为虫5 小时前
[学习记录] 幼儿学习拼音html游戏
学习·游戏
AOwhisky5 小时前
MySQL 学习笔记(第四期):SQL 语言之多表查询
linux·运维·网络·数据库·笔记·学习·mysql
Phantom Void5 小时前
服务器处理客户端请求的设计方法
linux·运维·网络
一段路6 小时前
【虚拟机】Linux常用命令
linux·vim
xian_wwq6 小时前
【学习笔记】「大模型安全:攻击面演化史」第 07 篇-安全左移
人工智能·笔记·学习
秋雨梧桐叶落莳6 小时前
iOS——NSUserDefaults学习
学习·macos·ios·objective-c·cocoa