Linux中C/C++程序编译过程与动静态链接库概述

Linux静态库与动态库 文章目录一、源代码的组织二、静态库三、动态库四、静态库与动态库的优缺点1、优点2、缺点五、动态库的优缺点1、优点2、缺点六、编译的优先级七、版权声明 一、源代码的组织 我们通常把公用的自定义函数和类从主程序中分离出来,函数和类的声明在头文件中,定义在程序文件中,主程序中要包含头文件,编译时要和程序文件一起编译。 示例(public.h) /* * 程序名:public.h,公共功能函数声明的头文... 阅读详情


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭
❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:嵌入式

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

目录

C/C++程序开发与链接库概述

ldd

用法

示例

选项

注意事项

结论

C/C++ 程序开发过程中的四个主要步骤

1. 预处理 (Preprocessing)

2. 编译 (Compilation)

3. 汇编 (Assembly)

4. 链接 (Linking)

总结

动态链接库

动态库的特点

动态库的管理

结论

静态链接库

静态库的特点

结论

静态库与动态库的比较

在某些云服务器上,默认情况下可能没有安装 C/C++ 的静态库和相关的编译工具链。

1. Ubuntu/Debian 系统

2. CentOS/RHEL 系统

3. 验证安装

4. 编译静态库示例

结论

先有语言还是先有编译器

1. 早期的编程语言

2. 高级语言的出现

3. 编译器的开发

4. 自举过程

总结


C/C++程序开发与链接库概述

ldd

ldd 是 Linux 中的一个命令,用于显示一个可执行文件或共享库所依赖的共享库(动态链接库)。这个命令可以帮助开发者和系统管理员检查程序的动态链接依赖关系,确保所有必要的库都能找到,并且程序能够正常运行。

用法

基本语法如下:

ldd [选项] <可执行文件>

示例

  1. 查看依赖库:

    ldd /path/to/your/executable
  2. 示例输出:

    linux-vdso.so.1 =>  (0x00007ffcb7ff3000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffcb7e7e000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ffcb81da000)
    

    这里的输出表示可执行文件依赖于 libc.so.6 和 ld-linux-x86-64.so.2 等共享库。

选项

  • --version:显示版本信息。
  • --help:显示帮助信息。
  • --quiet:只输出错误信息。

注意事项

  • ldd 可能会执行被检查的程序,尤其是在处理不受信任的二进制文件时,可能会存在安全风险。
  • 对于静态编译的程序,ldd 不会返回任何库,因为这些程序不依赖于共享库。

结论

ldd 是一个非常实用的工具,可以帮助开发者和运维人员排查动态链接库的问题,确保程序的可移植性和兼容性。

C/C++ 程序开发过程中的四个主要步骤

1. 预处理 (Preprocessing)

描述: 在这个步骤中,编译器处理所有的预处理指令,例如宏定义、条件编译和头文件包含。它生成一个扩展后的源代码文件。

Bash 示例:

gcc -E example.c -o example.i

实际例子: 假设有一个名为 example.c 的文件,内容如下:

#include <stdio.h>
#define PI 3.14

int main() {
    printf("Value of PI: %f\n", PI);
    return 0;
}

运行上述命令后,生成的 example.i 文件将包含所有的预处理指令处理结果,显示 #include 的内容以及宏 PI 的替换。

2. 编译 (Compilation)

描述: 在这个步骤中,编译器将预处理后的源代码转换为汇编语言。生成的文件通常以 .s 结尾。

Bash 示例:

gcc -S example.i -o example.s

实际例子: 使用上一步生成的 example.i 文件,运行上述命令后,生成的 example.s 文件可能包含类似以下内容:

	.file	"example.c"
	.text
	.globl	main
	.type	main, @function
main:
	...

3. 汇编 (Assembly)

描述: 在这个步骤中,汇编器将汇编代码转换为机器代码,生成目标文件,通常以 .o 或 .obj 结尾。

gcc -c example.s -o example.o

实际例子: 运行上述命令后,会生成 example.o 文件。这个文件包含了机器码,但不是一个完整的可执行程序。

4. 链接 (Linking)

描述: 在这个步骤中,链接器将目标文件与需要的库文件链接,生成最终的可执行文件。

Bash 示例:

gcc example.o -o example

实际例子: 运行上述命令后,会生成名为 example 的可执行文件。你可以运行它:

./example

输出将是:

Value of PI: 3.140000

总结

以上步骤展示了从源代码到可执行文件的完整过程,每一步都可以使用 Bash 命令在 Linux 中执行。这些步骤的输出文件在整个编译过程中扮演着重要的角色,确保程序的最终执行能够顺利进行。

动态链接库

libc.so.6 是 Linux 系统中的标准 C 库的动态链接库(shared library)。动态库的主要特点是可以在运行时被程序加载和使用,而不是在编译时将库的代码直接嵌入到可执行文件中。这使得程序可以共享同一个库,节省内存并简化更新过程。

动态库的特点

  1. 文件格式:动态库的文件名通常以 .so(Shared Object)为后缀,例如 libc.so.6。
  2. 共享性:多个程序可以共享同一个动态库,从而减少内存使用。
  3. 动态加载:程序在运行时可以动态加载库,支持插件式的开发。
  4. 版本控制:动态库支持版本控制,例如 libc.so.6 表示 C 标准库的一个具体版本。

动态库的管理

在 Linux 系统中,动态库通常存放在 /lib、/usr/lib 或 /usr/local/lib 目录下。可以使用 ldconfig 命令来更新动态库的缓存,以便系统能够找到新的库。

结论

libc.so.6 是 Linux 系统中标准 C 库的一个具体实现版本。动态库的使用不仅节省了内存资源,还使得程序的更新和维护变得更加方便。在开发中,创建和使用动态库是提高程序效率和模块化的关键技术。

静态链接库

静态链接库是在编译时将库的代码直接嵌入到可执行文件中,从而生成一个独立的可执行程序。静态库通常具有 .a 后缀(在 Linux 系统中),与动态链接库不同,静态链接库的代码在链接时就已经被复制到最终的可执行文件中,因此不需要在运行时依赖外部库。

静态库的特点

  1. 文件格式:静态库的文件通常以 .a 为后缀,例如 libmylib.a。
  2. 自包含性:链接静态库的可执行文件在运行时不需要外部库,适合在没有共享库环境的系统中运行。
  3. 文件体积大:由于静态库的代码被复制到每个可执行文件中,程序体积通常比使用动态库的大。
  4. 更新困难:如果库的代码需要更新,需要重新编译所有使用该库的程序。

结论

静态链接库在需要自包含性和不依赖外部环境的场合非常有用。尽管其更新成本较高,但在某些嵌入式系统或分发时无法保证共享库一致性的场合,静态库依然是一个非常实用的选择。

静态库与动态库的比较

特点静态库动态库
文件后缀.a.so
内存使用高(每个程序都有一份库的代码)低(共享库的代码)
更新方便性需重新编译所有依赖的程序只需更新库文件
运行时依赖无(不需要库文件)需要库文件
文件体积较大较小

在某些云服务器上,默认情况下可能没有安装 C/C++ 的静态库和相关的编译工具链。

要在这样的环境中开发和编译 C/C++ 程序,您需要手动安装必要的工具和库。下面是一些常见的 Linux 发行版(如 Ubuntu 和 CentOS)上安装 C/C++ 编译器和静态库的步骤。

1. Ubuntu/Debian 系统

对于基于 Debian 的系统(如 Ubuntu),可以使用 apt 包管理器进行安装:

# 更新包列表
sudo apt update

# 安装 C 和 C++ 编译器
sudo apt install build-essential

# 安装静态库
sudo apt install libc6-dev
  • build-essential 包包括 GCC(GNU Compiler Collection)、G++ 和其他编译工具以及标准库的开发文件。
  • libc6-dev 提供了 C 标准库的头文件和静态库。

2. CentOS/RHEL 系统

对于基于 RHEL 的系统(如 CentOS),可以使用 yum 或 dnf 包管理器进行安装:

# 更新包列表(可选)
sudo yum update

# 安装 C 和 C++ 编译器
sudo yum groupinstall "Development Tools"

# 安装静态库
sudo yum install glibc-devel
  • Development Tools 组包包含了 GCC、G++ 和其他开发工具。
  • glibc-devel 提供了 C 标准库的头文件和静态库。

3. 验证安装

安装完成后,可以通过以下命令验证 GCC 和 G++ 是否安装成功:

gcc --version
g++ --version

您应该能够看到安装的版本信息。

4. 编译静态库示例

一旦安装了编译工具,您可以按照以下步骤创建一个静态库:

  1. 创建源文件(mathlib.c):
    #include <stdio.h>
    
    void print_sum(int a, int b) {
        printf("Sum: %d\n", a + b);
    }
    
  2. 编译源文件为目标文件:
    gcc -c mathlib.c -o mathlib.o
    
  3. 创建静态库:
    ar rcs libmathlib.a mathlib.o
    
  4. 使用静态库的程序(main.c):
    #include <stdio.h>
    
    extern void print_sum(int, int);
    
    int main() {
        print_sum(3, 5);
        return 0;
    }
    
  5. 编译并链接:
    gcc main.c -L. -lmathlib -o main
    
  6. 运行程序:
    ./main
    

结论

在云服务器上,如果默认没有安装 C/C++ 的静态库和编译工具,您可以通过相应的包管理器手动安装所需的工具和库。安装完成后,您就可以开始编写和编译 C/C++ 程序了。

先有语言还是先有编译器

1. 早期的编程语言

  • 机器语言和汇编语言:
    • 在计算机发展的早期阶段,程序员主要使用机器语言(以二进制或十六进制形式表示)进行编程。这种语言直接对应于计算机硬件,程序员必须理解底层架构。
    • 随后,汇编语言出现,它为机器语言提供了助记符,使得编写程序更加容易,但仍然与具体的硬件架构紧密相关。

2. 高级语言的出现

  • 第一代高级语言:
    • 随着计算机技术的发展,出现了更高级的编程语言,例如 Fortran(1957 年)和 COBOL(1959 年)。这些语言允许程序员以更抽象的方式编写代码,不必关心底层的机器指令。

3. 编译器的开发

  • 编译器的实现:
    • 为了将这些高级语言转换为机器代码,开发了编译器。编译器是一种特殊的软件工具,负责将程序员编写的源代码翻译成计算机能够理解的指令。
    • 最早的编译器通常是用汇编语言或其他低级语言编写的,这使得编译器与特定的硬件架构紧密相连。

4. 自举过程

  • 自举(Bootstrapping):
    • 一旦编译器开发出来,就可以使用它来编译其他程序,包括它自身的后续版本。这个过程称为自举。
    • 例如,最初的 C 编译器可能用汇编语言实现,随后用 C 语言重写,最后能够用自己编译自己。

总结

综上所述,计算机历史上是先有编程语言,再有编译器。编程语言的出现为编译器的发展提供了基础,而编译器则使得这些语言可以被计算机理解和执行。因此,编程语言和编译器的关系是相互依存的,语言的设计往往影响编译器的实现,而编译器的发展又会推动语言的演进。

​​

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

Linux C++,so动态库 示例实例 Linux C++,so动态库 示例实例 本文以Eclipse集成开发环境为例进行说明。 # 一、主要步骤 **(1)创建动态连接库(.so)工程** (1.1)建立.so工程; (1.2)添加MyHelloworld.cpp、MyHelloworld.h文件 (1.3)添加 -fPIC编译选项 (1.4)新增自定义成员函数:PrintHelloWorld函数 ............ 阅读详情

相关推荐

Linux——gcc/g++编译器

Linux ——gcc/g++的编译链接过程,目标文件对动静态链接方式,动静态库的区别

weixin_69283129的博客 4802

linux系统下C/C++静态库和动态库的制作及使用

一般情况下,为了更好的支持开发,第三方库或者是语言库都必须提供静态库和动态库(eg:C C++等官方库),这是方便程序员根据需求功能进行可执行文件的生成;动态链接使用动态库,而静态链接使用静态库。一般来说,我们gcc编译默认是动态链接的而如果加上-static选项,那么生成的可执行文件将为静态生成;

figting 2564

【Linux】Linux编译器 gcc 的使用 | 动静态库的初步认识

通过gcc演示c程序变为可执行程序的过程、动静态链接库的讲解

StackFrame 1786

C/C++程序编译与链接(四) 创建动态库

其实站在开发者的角度,认为API与ABI是应该等价的,代码里的接口匹配,难道编译后,二进制文件中的接口对应的符号还不匹配吗?是的,对C++来说是要需要关注这些问题。

mo4776的博客 2147

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

weixin_57514792的博客 1103

别再死记硬背参数了!手把手教你用Fluent欧拉模型搞定流化床模拟(附颗粒粘度/体积分数设置详解)

本文深入解析Fluent欧拉模型在流化床模拟中的应用,重点讲解颗粒粘度和体积分数等关键参数的设置原理与科学方法。通过对比不同模型(如Syamlal-O'Brien、Gidaspow)的适用场景,帮助工程师摆脱参数死记硬背,实现精准模拟。内容涵盖相间作用机制、求解策略优化及结果验证,为化工、能源领域的流化床模拟提供实用指南。

weixin_42656416的博客 427

C++中编译静态库与动态库

静态库与动态库

scott198512的博客 3971

数模笔记_多变量最优化计算之牛顿法

Date: 2_22 Name: Guo Yehao Theme: Calculation in Optimality with multiple variables Reference: 数学建模方法与分析(华章) 在上一节中,我们讨论多变量最优化计算中的随机搜索算法,它的精度并不是众多算法中最高的。在精度问题上,有的时候问题本身就带有明显的误差性,以至于我们不能将其忽略,比如上一节消防站部署的问题,我们在区域划分时就有了误差,因此我们并不需要对结果要求很高的精确度,所以用一些比较粗略的算法就可以.

weixin_45358177的博客 2414

GCC编译过程和Linux的动静态库

因为在Windows下安装了vs这样的集成环境,Linux下安装了gcc这样的编译器,基于这样的环境我们才可以进行编译,编译型语言:安装开发包一定是下载安装的头文件和库文件。

qq_73752525的博客 950

Proteus 8.15仿真STM32F103C8,ADC采样总为0?别急着换芯片,先检查这3个配置

本文详细解析了在Proteus 8.15中仿真STM32F103C8时ADC采样值为0的常见原因及解决方法。从供电网络配置、时钟设置到ADC参数调整,提供了系统性的排查指南,帮助开发者快速定位问题,避免不必要的硬件更换。重点关注供电网络、时钟分频和ADC配置等关键环节。

weixin_30425949的博客 366

Python 爬虫实战:攻克小红书种草笔记,抓取美妆好物推荐数据

通过本次 Python 爬虫实战,我们成功地从小红书爬取了美妆种草笔记的数据,并进行了存储、处理、分析和可视化展示。在这个过程中,我们不仅掌握了爬虫技术的基本应用,还学会了如何对动态加载的数据进行处理和分析。然而,本次爬虫任务也存在一些局限性,例如仅爬取了部分笔记的数据,且未对笔记中的图片和视频内容进行分析。在未来的工作中,我们可以进一步优化爬虫程序,爬取更多笔记的数据,并深入分析笔记中的多媒体内容、用户行为模式等,为美妆品牌和消费者提供更有价值的数据支持。

u014481728的博客 3268

Linux编译器——gcc/g++使用

Linux编译器——gcc/g++使用

m0_56069910的博客 4542

芯片测试:WAT、CP、FT

最近部门来了一个日本回来的同事,虽然他尽量用非常Poor的中文给我解释一些东西,其中还夹杂着一些英文让我很受挫,于是最近来学一下WAT中的常用的单词含义。直接去查缩写、查单词很难去记住,要把具体的东西放在具体的场景,引发知识的连接才会在脑子里留下一定的映像。感兴趣的一起来学习一下这篇不错的文章吧。注释是我查询记录,如有不妥,欢迎指出修正。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 5079

【Linux】Linux编译器 gcc/g++的使用&&初识动静态链接库

今天我们学习了如何使用 gcc/g++ ,了解程序经过翻译环境形成可执行程序的过程。还初步认识了动静态库,实际上动静态库还有很多知识,等到基础 I/O 再进一步学习。接下来,我们将继续学习其他Linux环境基础工具的基本使用及配置。希望我的文章和讲解能对大家的学习提供一些帮助。

Sherry的博客 959

Open3D 点云DBSCAN聚类算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,能够识别任意形状的聚类,并处理噪声数据。

纵马踏花向自由 1833

SOC、SOH、OCV

1)放电实验法的测量SOH结果最为准确,但是深度放电会对影响电池的寿命;2)电阻折算法仅将电阻作为评价SOH的依据,但电池老化时电阻的变化范围较小,因此该方法的误差较大;3)电阻折算法需要对电池进行大量的实验,绘制成Map图,但是该方法有一定的局限性,针对不同的电池需要绘制不同的Map图;4)阻抗分析法是目前最为前沿的方法,可以根据阻抗谱较为直观的分析SOH的变化,但是该方法需要的成本较高,每台设备约为5万美元。

m0_61973119的博客 2万+

Linux编译器gcc/g++使用完全指南:从编译原理到动静态链接

掌握gcc/g++的编译原理和使用技巧,是成为Linux开发高手的必经之路。希望本文能帮助您系统理解编译过程,在实际开发中游刃有余!💡 思考题:为什么说"编译器也是软件"?因为编译器本身就是用其他语言编写的程序,可以通过迭代不断升级。📌 注意:虽然g++可以编译C代码,但建议严格区分使用,避免潜在的兼容性问题。

zoelinkailuo的博客 1198

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深度解析Linux中的编译器gcc/g++

gcc只用来编译C语言g++用来编译C/C++程序的翻译步骤经历四个过程的1、预处理(进行宏替换/去注释/条件编译/头文件展开等)这个-E的意思是从现在开始,进行程序的翻译,一但预处理做完了,就停下来那么这里的code.i保存的是预处理之后的结果我们这里的-o选项就是指明了我们的生成文件的名称了那么我们将这个code.i文件和原始的code.c进行对比下对比发现我们的源文件有24行,预处理结算的代码有800多行我们在这个阶段进行了进行宏替换/去注释/条件编译/头文件展开等等操作。

2301_80863610的博客 2792

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux---gcc编译

之前的阶段这么多,每一次执行的代码都不一样,但其实很好记忆。编译方式 -ESc 后缀.iso分别代表(预处理、编译、汇编)ESc注意前面两个大写,后一个小写,这是键盘左上角的三个iso为系统镜像后缀,记住这两点就可以了。

kkbca的博客 1529

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Linux】动态库与静态库

本篇文章博主会与大家共同学习动静态库的相关内容,涉及到动静态库的基本知识与特征,动静态库的打包与使用等内容。

℉f的博客 2474

【Linux系统】—— 动静态库

动静态库

yusjushd的博客 1543

『Linux - gcc / g++』c程序翻译过程

在计算机中的每一个程序是由代码变化而来的,但是事实上来说,用 c/C++ 写出的代码是不能被计算机识别的,其中必须经过一系列的过程才能使这个代码能成功的被计算机识别;这几个过程分别为:预处理编译汇编链接在经历过这几个过程之后才能将代码转换为一个可执行程序;

小侯宝的博客 830

Linux下的编译工具 —— gcc、g++

同样的道理,当C语言被发明出来之后,我们也是先用C语言前面的语言写一个C语言的编译器,也就是汇编语言写的C语言的编译器,此时我们就能够编译C语言程序了,再用C语言写一个C语言的编译器,然后用汇编语言写的编译器编译,就得到了C语言写的C语言编译器,再对其进行优化,用旧的C语言写的编译器编译新的C语言写的编译器、就得到了新的C语言编译器。之后,我们再对汇编语言写的编译器进行优化,写一个。的用汇编语言写的编译器,再用老版本的汇编语言的编译器编译新版本的编译器,得到新版本的汇编语言的编译器。

知其然 知其所以然 1067

Linux中的动静态库

在刚开始学习C语言代码的时候,我们需要引入一个名为stdio.h的头文件,在头文件中为我们一些读写方法的声明,我们可以根据这些声明来使用接口实现对应的功能。但我们要知道,光有函数方法的声明是无法正常使用一个函数,还需要函数的具体定义,函数的定义就写在对应的库文件中。在本文中我们将介绍如何制作一个库,以及动静态库的区别。

m0_73987904的博客 1826

【Linux】Linux动静态库链接:从原理到实战,彻底搞懂程序运行的“最后一公里“

欢迎来到 CILMY23 的博客🏆本篇主题为:Linux动静态库链接:从原理到实战,彻底搞懂程序运行的"最后一公里"如果你觉得有帮助,还可以点点关注。

cilmy23的note 1129

Linux编译器-gcc/g++(动静态链接)

我们为什么能在windows或者linux下进行C/C++或者其它形式的开发呢?前提条件是我们的系统一定要安装上C/C++开发相关的头文件和库文件。所以我们平时下载安装的C/C++开发环境不仅仅指的是VS/gcc/g++,更重要的是语言本身的头文件和库文件。当我们在下载安装VS2019等软件,选择开发包的时候,也在同步下载语言的头文件和库文件。所以,编译型语言,在安装开发包时,必定是安装对应的头文件和库文件的。

weixin_70056514的博客 751
上一篇: 用 effet.js 打造趣味人脸互动:实际用例和实战指南
下一篇: 深入掌握 Makefile 与 Make 工具:高效管理自动化编译的核心原理和最佳实践
Srlua小谢
Srlua小谢 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄4年 8963粉丝 332原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值