从零开始:Linux 环境下的 C/C++ 编译教程
个人主页:chian-ocean
文章专栏
前言:
GCC(GNU Compiler Collection)是一个功能强大的编译器集合,支持多种语言,包括 C 和 C++。其中 gcc 用于 C 语言编译,g++ 专用于 C++ 编译。
Linux GCC or G++的安装
安装 GCC
运行以下命令安装 GCC:
sudo yum install -r gcc
安装完成后,可以再次检查版本:
gcc --version
安装G++
运行以下命令安装 GCC:
sudo yum install -r g++
安装完成后,可以再次检查版本:
g++ --version
Linux的代码编译
预处理(Preprocessing)
预处理的工作
- 去掉注释
- 展开头文件
- 条件编译
- 宏替换
C++代码执行
g++ -E code.cpp -o code.i
# 可以生成与处理文件,生成.i文件
编译(Compilation)
编译器将预处理后的源代码转换为汇编代码(文本形式的机器指令)。
- 生成汇编代码(通常是
.s
文件)。 - 编译器会进行语法分析和语义检查。
g++ -S code.i -o code.s
# 可以生成与处理文件,生成.s文件
汇编(Assembly)
汇编器将汇编代码(.s
文件)转换为二进制的目标代码(.o
文件)。
- 汇编代码被转换为机器能够理解的指令。
- 生成目标文件(通常是
.o
或.obj
文件)。
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
ldd #可以查看可执行程序所依赖的动态库
下面是code可执行文件所以来的动态库
静态链接
静态库是一种将一组目标文件(.o
文件)打包成单个文件(通常扩展名为 .a
或 .lib
)的技术,便于代码复用。静态库在编译时链接到可执行文件中,因此运行时不需要额外的库支持。
- Linux:
.a
- Windows:
.lib
g++ code.cpp -static -o code-static # 可以生成静态链接
动态VS静态
定义
链接方式 | 定义 |
---|---|
静态链接 | 在编译阶段,将所需库的代码嵌入到可执行文件中,生成一个独立的可执行文件。 |
动态链接 | 在运行时加载所需的库(动态库),可执行文件只包含对库的符号引用,库本身存储在外部文件中(如 .so )。 |
操作系统命名
操作系统 | 静态库扩展名 | 动态库扩展名 |
---|---|---|
Linux | .a | .so |
Windows | .lib | .dll |
macOS | .a | .dylib |
对比表
特性 | 静态链接 | 动态链接 |
---|---|---|
生成的可执行文件大小 | 较大(嵌入所有库代码) | 较小(仅包含对动态库的引用) |
运行时依赖 | 无需外部库,独立运行 | 需要动态库文件 |
运行效率 | 高(无需加载外部库,直接执行) | 稍低(运行时加载动态库) |
内存使用 | 每个程序独立占用库的代码和数据 | 多个程序共享同一动态库 |
更新维护 | 更新库后需重新编译程序 | 更新库后程序无需重新编译 |
部署和兼容性 | 部署简单,无需额外的动态库 | 部署复杂,需要确保动态库存在并与程序兼容 |
符号冲突 | 不易出现,因为库代码独立嵌入到每个可执行文件中 | 可能出现多个库之间的符号冲突 |
和兼容性** | 部署简单,无需额外的动态库 | 部署复杂,需要确保动态库存在并与程序兼容 |
符号冲突 | 不易出现,因为库代码独立嵌入到每个可执行文件中 | 可能出现多个库之间的符号冲突 |
适用场景 | 嵌入式系统、小型独立工具、运行环境固定的场景 | 大型系统、需要频繁更新库或共享库的场景 |
相关文章:

从零开始:Linux 环境下的 C/C++ 编译教程
个人主页:chian-ocean 文章专栏 前言: GCC(GNU Compiler Collection)是一个功能强大的编译器集合,支持多种语言,包括 C 和 C。其中 gcc 用于 C 语言编译,g 专用于 C 编译。 Linux GCC or G的安…...
Rust学习(十):计算机科学简述
Rust学习(十):计算机科学简述 在计算机技术这片广袤的领域中,深入理解其内在机制与逻辑需要付出诸多努力。 学习基础知识是构建计算机技术能力大厦的基石,而这一过程往往漫长而艰辛。只有在对基础知识有了扎实的掌握…...
【西瓜书】剪枝与样本值处理——预剪枝、后剪枝、连续值、缺失值
目录 预剪枝 后剪枝 处理连续值 处理缺失值 剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。 在决策树学习过程中,有时会造成决策树分枝过多,就可能造成过拟合,可通过主动去掉一些分支来降低过离合的风…...

NLP 1、人工智能与NLP简介
人人都不看好你,可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg:特定场景下的文本分类、垂直领域下的对…...
常见线程安全问题之Double Checked Locking
创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家! 双重锁定检查(Double Checked Locking,下称 DCL)是并发下实现懒…...
Redis(非关系型数据库)的作用 详细解读
edis(Remote Dictionary Server)是一个开源的、高性能的、基于内存的数据结构存储系统。它具有极高的读写性能,并且能够支持多种数据结构的存储。Redis 最初的设计目标是作为一个缓存解决方案,但随着其功能的不断扩展,…...

互联网视频推拉流EasyDSS视频直播点播平台视频转码有哪些技术特点和应用?
视频转码本质上是一个先解码再编码的过程。在转码过程中,原始视频码流首先被解码成原始图像数据,然后再根据目标编码标准、分辨率、帧率、码率等参数重新进行编码。这样,转换前后的码流可能遵循相同的视频编码标准,也可能不遵循。…...
python之多元线性回归
目录 前言实战 前言 多元线性回归是回归分析中的一种复杂模型,它考虑了多个输入变量对输出变量的影响。与一元线性回归不同,多元线性回归通过引入多个因素,更全面地建模了系统关系。 多元线性回归模型的表达式为: f ( X ) K T …...

学习threejs,使用设置lightMap光照贴图创建阴影效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshLambertMaterial…...

一,SQL注入解题(猫舍)
封神台 第一章:为了女神小芳! Tips: 通过sql注入拿到管理员密码! 尤里正在追女神小芳,在得知小芳开了一家公司后,尤里通过whois查询发现了小芳公司网站 学过一点黑客技术的他,想在女神面前炫炫技。于是他…...

海康大华宇视视频平台EasyCVR私有化部署视频平台海康ISUP是什么?如何接入到EasyCVR?
在现代安防领域,随着技术的发展和需求的增加,对于视频监控系统的远程管理和互联互通能力提出了更高的要求。海康威视的ISUP协议(以及功能相似的EHOME协议)因此应运而生,它们为不具备固定IP接入的设备提供了一种有效的中…...

Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚
我的个人主页 我的专栏:Java-数据结构,希望能帮助到大家!!!点赞❤ 收藏❤ 前言:在 Java编程的广袤世界里,数据结构犹如精巧的建筑蓝图,决定着程序在数据处理与存储时的效率、灵活性以…...

windows下安装wsl的ubuntu,同时配置深度学习环境
写在前面,本次文章只是个人学习记录,不具备教程的作用。个别信息是网上的,我会标注,个人是gpt生成的 安装wsl 直接看这个就行;可以不用备份软件源。 https://blog.csdn.net/weixin_44301630/article/details/1223900…...

开展网络安全成熟度评估:业务分析师的工具和技术
想象一下,您坐在飞机驾驶舱内。起飞前,您需要确保所有系统(从发动机到导航工具)均正常运行。现在,将您的业务视为飞机,将网络安全视为飞行前必须检查的系统。就像飞行员依赖检查表一样,业务分析师使用网络安全成熟度评估来评估组织对网络威胁的准备程度。这些评估可帮助…...
Maven Surefire 插件简介
Maven Surefire 插件是 Maven 构建系统中的一个关键组件,专门用于在构建生命周期中执行单元测试。 它通常与 Maven 构建生命周期的测试阶段绑定,确保所有单元测试在项目编译后和打包前被执行。 最新版本 Maven Surefire 插件的最新版本为 3.5.2。 使…...

基于微信小程序的平价药房管理系统+LW参考示例
1.项目介绍 系统角色:管理员、医生、普通用户功能模块:用户管理、医生管理、药品分类管理、药品信息管理、在线问诊管理、生活常识管理、日常提醒管理、过期处理、订单管理等技术选型:SpringBoot,Vue,uniapp等测试环境…...
react 前端最后阶段静态服务器启动命令
这个错误是因为你还没有安装 serve 工具。让我们一步步解决: 首先全局安装 serve: npm install -g serve如果上面的命令报错,可能是因为权限问题,可以尝试: 安装完成后,再运行: Windows 下使用…...
Flink中普通API的使用
本篇文章从Source、Transformation(转换因子)、sink这三个地方进行讲解 Source: 创建DataStream本地文件SocketKafka Transformation(转换因子): mapFlatMapFilterKeyByReduceUnion和connectSide Outpu…...
高性能 ArkUI 应用开发:复杂 UI 场景中的内存管理与 XML 优化
本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。 主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。 本文为原创内容,任何形式的转载必须注明出处及原作者。 在开发高性能 ArkUI 应…...

用天翼云搭建一个HivisionIDPhoto证件照处理网站
世人不必记我,我不记世人。 HivisionIDPhoto证件照处理网站 世人不必记我,我不记世人。项目地址项目搭建与修改前端后端遇到的坑 成果图 前段时间工作需要频繁处理证件照,当时同事推荐一个证件照小程序(要看广告)&…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
Git 命令全流程总结
以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...