从零开始:Linux 环境下的 C/C++ 编译教程

个人主页:chian-ocean

文章专栏

前言:

GCC(GNU Compiler Collection)是一个功能强大的编译器集合,支持多种语言,包括 C 和 C++。其中 gcc 用于 C 语言编译,g++ 专用于 C++ 编译。

Linux GCC or G++的安装

安装 GCC

运行以下命令安装 GCC:

bash 复制代码
sudo yum install -r gcc

安装完成后,可以再次检查版本:

bash 复制代码
gcc --version

安装G++

运行以下命令安装 GCC:

bash 复制代码
sudo yum install -r g++

安装完成后,可以再次检查版本:

bash 复制代码
g++ --version

Linux的代码编译

预处理(Preprocessing)

预处理的工作

  • 去掉注释
  • 展开头文件
  • 条件编译
  • 宏替换

C++代码执行

bash 复制代码
g++ -E code.cpp -o code.i 
# 可以生成与处理文件,生成.i文件

编译(Compilation)

编译器将预处理后的源代码转换为汇编代码(文本形式的机器指令)。

  • 生成汇编代码(通常是 .s 文件)。
  • 编译器会进行语法分析和语义检查。
bash 复制代码
g++ -S code.i -o code.s
# 可以生成与处理文件,生成.s文件

汇编(Assembly)

汇编器将汇编代码(.s 文件)转换为二进制的目标代码(.o 文件)。

  • 汇编代码被转换为机器能够理解的指令。
  • 生成目标文件(通常是 .o.obj 文件)。
bash 复制代码
g++ -E code.s -o code.0
# 可以生成与处理文件,生成.0文件
od filename # 可以进行查看

链接(Linking)

函数库(Library)简介

在编程中,函数库 是指封装了一组可重用函数、类或其他代码模块的集合,目的是简化开发、提高代码复用性。函数库通常以静态库(*.a*.lib)或动态库(*.so*.dll*.dylib)的形式存在。

类型 描述
静态库 在编译时将库的代码嵌入到可执行文件中,生成的文件独立运行,不依赖外部库。
动态库 在运行时加载库文件,节省空间和内存,可以被多个程序共享。

动态链接

动态库(Dynamic Library)是一种在运行时加载的库,可以被多个程序共享,以节省存储空间和内存。动态库的文件扩展名在不同操作系统中有所不同:

  • Linux: .so(Shared Object)
  • Windows: .dll(Dynamic Link Library)
  • macOS: .dylib
bash 复制代码
ldd  #可以查看可执行程序所依赖的动态库

下面是code可执行文件所以来的动态库

静态链接

静态库 是一种将一组目标文件(.o 文件)打包成单个文件(通常扩展名为 .a.lib)的技术,便于代码复用。静态库在编译时链接到可执行文件中,因此运行时不需要额外的库支持。

  • Linux: .a
  • Windows: .lib
bash 复制代码
g++ code.cpp -static -o code-static # 可以生成静态链接

动态VS静态

定义

链接方式 定义
静态链接 在编译阶段,将所需库的代码嵌入到可执行文件中,生成一个独立的可执行文件。
动态链接 在运行时加载所需的库(动态库),可执行文件只包含对库的符号引用,库本身存储在外部文件中(如 .so)。

操作系统命名

操作系统 静态库扩展名 动态库扩展名
Linux .a .so
Windows .lib .dll
macOS .a .dylib

对比表

特性 静态链接 动态链接
生成的可执行文件大小 较大(嵌入所有库代码) 较小(仅包含对动态库的引用)
运行时依赖 无需外部库,独立运行 需要动态库文件
运行效率 高(无需加载外部库,直接执行) 稍低(运行时加载动态库)
内存使用 每个程序独立占用库的代码和数据 多个程序共享同一动态库
更新维护 更新库后需重新编译程序 更新库后程序无需重新编译
部署和兼容性 部署简单,无需额外的动态库 部署复杂,需要确保动态库存在并与程序兼容
符号冲突 不易出现,因为库代码独立嵌入到每个可执行文件中 可能出现多个库之间的符号冲突
和兼容性** 部署简单,无需额外的动态库 部署复杂,需要确保动态库存在并与程序兼容
符号冲突 不易出现,因为库代码独立嵌入到每个可执行文件中 可能出现多个库之间的符号冲突
适用场景 嵌入式系统、小型独立工具、运行环境固定的场景 大型系统、需要频繁更新库或共享库的场景
相关推荐
懒羊羊大王&8 小时前
模版进阶(沉淀中)
c++
cg50178 小时前
Spring Boot 的配置文件
java·linux·spring boot
似水এ᭄往昔8 小时前
【C语言】文件操作
c语言·开发语言
暮云星影8 小时前
三、FFmpeg学习笔记
linux·ffmpeg
owde8 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
rainFFrain9 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon9 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
W_chuanqi9 小时前
安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
蒙奇D索大9 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
mingqian_chu9 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu