首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux C++编程:为什么连接是.so,生成的可执行依赖库是.so.version

在Linux环境下进行C++编程时,经常会遇到.so文件,这些文件是共享库(Shared Libraries)的一种表示。.so文件允许程序在运行时动态链接到库,而不是在编译时静态链接,这样可以提高代码的复用性和可维护性。

基础概念

共享库(Shared Library)

  • 是一种包含可由多个程序同时使用的代码和数据的文件。
  • 在Linux系统中通常以.so(即shared object)为扩展名。

版本控制

  • .so.version文件用于跟踪共享库的版本信息。
  • 这有助于系统管理员和开发者了解当前安装的库版本,以及在升级或降级时保持兼容性。

相关优势

  1. 节省磁盘空间:多个程序可以共享同一个库文件,而不是每个程序都包含一份副本。
  2. 便于更新和维护:只需替换共享库文件,所有依赖它的程序都能自动使用新版本。
  3. 提高安全性:可以通过替换库文件来修复安全漏洞,而无需重新编译和分发所有依赖它的程序。

类型与应用场景

类型

  • 静态库.a):在编译时链接到程序中,成为程序的一部分。
  • 动态库.so):在运行时链接,多个程序可以共享同一个库实例。

应用场景

  • 大型软件系统:使用共享库可以减少重复代码,便于管理和维护。
  • 插件架构:允许第三方开发者编写扩展功能,通过加载共享库来实现。
  • 跨平台兼容性:动态链接使得程序在不同版本的操作系统上运行时能够灵活适应。

问题解析

为什么连接是.so

  • 在编译阶段,链接器会查找并链接指定的.so文件,以确保程序在运行时能够找到并使用这些库中的函数和数据。

生成的可执行依赖库是.so.version

  • .so.version文件通常是由库的维护者创建的,用于标识库的版本信息。
  • 它帮助系统确定哪个版本的库应该被加载,尤其是在存在多个版本的情况下。
  • 这种机制有助于保持系统的稳定性和兼容性。

解决方法

如果你遇到了与.so文件相关的问题,可以尝试以下步骤来解决:

  1. 检查库路径
  2. 检查库路径
  3. 这将列出系统中所有可用的库及其版本。
  4. 更新库文件: 如果发现版本过旧或不兼容,可以从源码重新编译安装最新版本。
  5. 设置环境变量
  6. 设置环境变量
  7. 这可以临时指定程序查找库文件的路径。
  8. 使用ldd工具
  9. 使用ldd工具
  10. 查看可执行文件依赖的库及其路径,确认是否有缺失或错误的链接。

通过以上方法,通常可以解决大多数与共享库相关的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

C/C++程序开发与链接库概述 ldd ldd 是 Linux 中的一个命令,用于显示一个可执行文件或共享库所依赖的共享库(动态链接库)。...用法 基本语法如下: ldd [选项] 可执行文件> 示例 查看依赖库: ldd /path/to/your/executable 示例输出: linux-vdso.so.1 => (0x00007ffcb7ff3000...) 这里的输出表示可执行文件依赖于 libc.so.6 和 ld-linux-x86-64.so.2 等共享库。...静态链接库 静态链接库是在编译时将库的代码直接嵌入到可执行文件中,从而生成一个独立的可执行程序。...要在这样的环境中开发和编译 C/C++ 程序,您需要手动安装必要的工具和库。下面是一些常见的 Linux 发行版(如 Ubuntu 和 CentOS)上安装 C/C++ 编译器和静态库的步骤。 1.

29710

【Linux系统编程】——深入理解 GCCG++ 编译过程及常用选项详解

gcc -c hello.s -o hello.o -c:只进行汇编,不执行链接,生成 .o 目标文件。 连接(Linking) 连接阶段将多个 .o 目标文件和库文件链接成一个可执行文件。...gcc hello.o -o hello 默认链接动态库(如 libc.so.6),生成的可执行文件可以直接运行。...缺点: 运行时需要依赖动态库,若缺失动态库则程序无法运行。 动态库文件后缀: .so(Linux)或 .dll(Windows)。...可执行文件中包含所有依赖的库代码,运行时无需依赖外部动态库。...为什么非得把语言变成汇编 编译器的职责 编译器的职责是将高级语言(如 C/C++)编写的程序,转换为计算机可以理解并执行的低级语言(机器代码)。

29520
  • c++动态库和静态库的区别_静态库里面包含动态库

    现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。...Linux下创建与使用动态库 linux动态库的命名规则 动态链接库的名字形式为 libxxx.so,前缀是lib,后缀名为“.so”。...2) 对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表...:表示要连接的库所在的目录。 l -l:指定链接时需要的动态库。编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a/.so来确定库的名称。...$nm libhello.h ldd命令 ldd命令可以查看一个可执行程序依赖的共享库,例如我们编写的四则运算动态库依赖下面这些库: 总结 二者的不同点在于代码被载入的时刻不同。

    1.9K30

    GCC写个库给你玩,就这?

    前言 什么是GCC GCC原名为 GNU C语言编译器 「GCC」(GNU Compiler Collection,GNU编译套件) 是由GNU开发的编程语言编译器。...「两者都可以」,请注意: 「后缀为.c」的,gcc把它当作是「C程序」,而g++当作是c++程序 「后缀为.cpp」 的,两者都会认为是「C++程序」,C++的语法规则更加严谨一些 编译阶段,g++会调用...「so : 后缀(固定)」 「在Linux下是一个可执行文件」 Windows : libxxx.dll 使用静态库的测试代码,库目录结构还是一样 [root@deroy]# tree . ├── calc.../lib64/ld-linux-x86-64.so.2 (0x00007f36061a9000) 通过ldd命令查看程序动态库依赖关系 ldd是list dynamic dependencies的缩写...,意思是列出动态库依赖关系。

    1.1K10

    【Linux系统编程】Linux下的编译器——gccg++的使用 及 动态库和静态库的认识

    gcc 可以将 C 语言源代码编译成可执行文件,或者生成汇编代码和目标文件。 g++: g++ 是 GNU 编译器集合中的 C++ 语言编译器。...大家思考一个问题,为什么我们在Linux上可以进行C/C++代码的编译链接这些动作呢?...它会递归地检查可执行文件或共享库文件所依赖的其他库文件,以及这些依赖的库文件的依赖,一直到所有依赖的库文件列表打印完毕。...第二个libc.so.6其实就是Linux中的C标准库。...当你需要使用这些书籍时,你只需从书包中取出,不需要依赖图书馆,也不会影响其他学生。 在编程中,静态库是在编译时将库的代码和程序代码链接在一起,形成一个单独的可执行文件。

    1.7K10

    CC++生态工具链——gccg++编译器使用指南

    当正在编译的C++代码文件依赖STL标准库的时候,为了使用STL,gcc命令需要增加参数–lstdc++。因此,虽然gcc和g++都可以编译C++语言程序,但是使用g++会更方便一些。...2.编译 首先检查代码的规范性和语法错误等,检查完毕后把代码翻译成汇编语言,生成汇编语言文件 3.汇编 基于汇编语言文件生成二进制格式的目标文件 3.链接 将目标代码与所依赖的库文件进行关联或者组装,合成一个可执行文件...使用“gcc -shared -fPIC”可以直接用xxx.c源文件生成xxx.so动态库。 目标程序与动态库链接时,可执行文件仅包含它所需的一个小函数表,而不是来自库文件的完整机器代码。...在可执行文件开始运行之前,动态库的代码被操作系统复制到内存中进行共享。 动态库之所以叫共享库,可能是由于动态库的代码副本可以在多个程序之间共享。...格式的文件 -static #生成静态库,库文件格式为xxx.a格式的文件 -Wl #告诉编译器将后面的参数传递给链接器 -Wl,-Bstatic #-Bstatic选项用于对指定的库静态连接

    2.7K30

    Linux下关于动态库的说明 | 编译以及调用

    2017-07-23 学习C++动态库的基本知识 网络总结知识点 ---- 动态库的概念 ​ 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输出操作或屏幕控制等标准任务函数...(通常C:\windows\System32等目录下存在大量系统提供的以.dll结尾的动态库文件) ---- 动态库和静态库的区别 ​ 静态库是指编译连接时,把库文件的代码全部加入到可执行文件中...test.cpp ---- 动态库的使用 我们编写一个C++程序来使用刚刚生成的动态库文件 test.cpp源码 #include "so_demo.h" int main(){ sayHello...(); printInfo(); return 0; } 编译test.cpp源码 # 先将生成的libdemo.so文件放进系统默认的依赖库目录中 ➜ sudo cp libdemo.so...相当于一个可执行文件 -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。 -L.

    2.2K40

    深入理解GCC 和 G++ 编译器

    GCC 是一个多语言支持的编译器,可以处理 C、C++、Fortran 等语言,而 G++ 是 GCC 的 C++ 前端,用于专门处理 C++ 源代码。...连接阶段 连接阶段将多个目标文件和库文件链接在一起,生成可执行文件或库文件。连接过程中可能会调用外部的动态或静态库。...使用静态链接,生成不依赖动态库的可执行文件 -shared 生成动态库 程序开发中,链接是将目标文件与库文件结合的过程,链接方式主要分为静态链接和动态链接。...静态链接 静态链接是在编译阶段将库文件的代码直接嵌入到可执行文件中。 优点: 独立性:生成的可执行文件不依赖外部库,运行时无需额外的动态库支持。 高效性:运行速度快,因为无需动态加载库。...查看动态链接依赖库: ldd hello 示例输出: linux-vdso.so.1 => (0x00007fffeb1ab000) libc.so.6 => /lib64/libc.so.6 (0x00007ff776af5000

    25210

    【linux学习指南】Linux编译器 gcc和g++使用

    前言 预处理(进行宏替换) 编译(生成汇编) 汇编(生成机器可识别代码) 连接(生成可执行文件或库文件) gcc如何完成 格式 :gcc [选项] 要编译的文件 [选项] [目标文件] 预处理(进行宏替换...动态库: .so (linux).dll(windows) 静态库: .a (linux).lib 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时...,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用 ldd 命令用于显示一个可执行文件或共享库所依赖的共享库列表...函数库一般分为静态库和动态库两种。 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也 就不再需要库文件了。...动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态 库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。

    20810

    编译器gccg++ --【Linux基础开发工具】

    一、背景知识 预处理(进行宏替换/去注释/条件编译/头文件展开等) 编译(生成汇编) 汇编(生成机器可识别代码) 连接(生成可执行文件或库文件) 二、gcc编译选项 格式 gcc [选项] 要编译的文件...比如我们查看下 hello 这个可执行程序依赖的动态库,会发现它就用到了一个c动态链接库: $ ldd hello linux-vdso.so.1 => (0x00007fffeb1ab000)...动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。...注意: • Linux下,动态库XXX.so, 静态库XXX.a • Windows下,动态库XXX.dll, 静态库XXX.lib 一般我们的云服务器,C/C++的静态库并没有安装,可以采用如下方法安装...实际案例 许多现代编程语言都是采用这种方式发展的,例如GCC (GNU Compiler Collection) 的开发就是基于C/C++本身的;还有像Python这样的脚本语言也经历了类似的发展路径

    24510

    linux动态库和静态库

    由于 windows 和 linux 的平台不同(主要是编译器、汇编器和连接器 的不同),因此二者库的二进制是不兼容的。        本文仅限于介绍 linux 下的库。...静态用.a为后缀, 例如: libhello.a    共享库(动态库)的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此生成的可执行程序代码体积较小。...1.6、使用ldd工具,查看可执行程序依赖那些动态库或着动态库依赖于那些动态库: ldd 命令可以查看一个可执行程序依赖的共享库, 例如 # ldd /bin/lnlibc.so.6...file *.so; 如果是静态哭,可以使用objdump -x *.a Linux下进行程序设计时,关于库的使用: 一、gcc/g++命令中关于库的参数: -shared: 该选项指定生成动态连接库...-o test -Wl,-Bdynamic -llibname 如果要完全静态加在,使用-static参数,即将所有的库以静态的方式链入可执行程序,这样生成的可执行程序,不再依赖任何库,同事出现的问题是

    12.4K20

    【Linux】掌握库的艺术:我的动静态库封装之旅

    1.什么是库 在计算机编程中,库(Library)是一个预先编写的代码集合,包含了可以被其他程序调用的函数、类、变量和资源。...如此一来,库的本质就是若干个目标文件的集合,每一个目标文件都包含了由源码编译生成的二进制代码,在保证使用的同时,还有很好的隐藏性 1.2 认识动静态库 动静态库是编程中常用的两种库类型,用于封装和重用代码...\n"); return 0; } //生成可执行文件mybin 编译成功后,我们使用ldd指令来查看其所链接的动态库 ldd语法: ldd filename 功能: 用于打印程序或库文件所依赖的动态库...1.2.2 静态库 静态库是将一组对象文件(.o 文件)打包成一个库文件(通常为 .a 后缀),在编译时将其链接到最终生成的可执行文件中。链接过程是在编译阶段完成的,库的代码被复制到可执行文件中。...使用ldd观察是否有依赖的库 ubuntu@VM-20-9-ubuntu:~/libraryTest$ ldd staticBin not a dynamic executable 发现静态链接生成的可执行程序不依赖其他库文件

    8410

    【LinuxC++】Linux下C++命令行编译示例

    此文档是在Linux下C/C++开发的g++编译示例,如果继续阅读此文,并希望有所收获,你应当具备以下技能 C++编程语言基础 Linux系统操作基础 文章目录 1. 准备源代码 2....生成库文件 链接静态库生成可执行文件 链接动态库生成可执行文件 静态库和动态库生成可执行文件的区别 这是这个系列的第2篇文章,你可以通过以下链接阅读第一篇 1....Linux中编译C++代码的g++工具,以及g++的常用操作指令 1....而用动态库编译生成的可执行文件,直接运行会报错,是因为动态链接文件在我们的代码目录,并不在系统的库搜索目录。如果要运行动态链接库打包生成的可执行文件,我们需要手动指定程序运行依赖的库目录。.../static_main 运行动态链接库打包生成的可执行文件 # 运行动态打包的可执行文件,需要设置 LD_LIBRARY_PATH 变量,变量值是动态链接文件所在目录 LD_LIBRARY_PATH=

    2.3K20

    【Linux】动静态库

    对于学习C/C++的同学来说:听到最多的就是标准库,其次就是库函数。但究竟什么是库呢?为什么我们只需要添加一下头文件,就可以使用库中包含的函数了呢?别着急,通过本文,我们都会讲清楚。...另外对于C/C++来说其库的名称也是有规范要求的,例如在Linux下:一般要求是lib + 库的真实名称 +(版本号)+ .so /.a + (版本号),版本号是可以省略不写的。...例如这两个标准库 : libstdc++.so.6    真实名称是 c++ libc-2.17.so     真实名称是 c 头文件与库的关系 头文件提供方法说明,库提供方法的实现,头和库是有对应关系的...2、编译:将预处理后的文件转换成汇编语言,生成.s文件 3、汇编:汇编变为目标代码(机器代码)生成.o的文件。 4、链接:连接目标代码,生成可执行程序。在链接之前,各个头文件都是独立进行编译的。...一般来说可执行程序在生成时,会对多个库进行链接,我们可以使用ldd命令查看我们的程序链接了那些库,可执行程序在连接时也可以选择部分采用动态库部分采用静态库。

    9110

    Linux 程序编译过程详解

    为了便于初学者理解,在此介绍动态库与静态库的概念: 如果要将多个.o目标文件生成一个库文件,则存在两种类型的库,一种是静态库,另一种是动态库。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。 如果一个系统中存在多个需要同时运行的程序且这些程序之间存在共享库,那么采用动态库的形式将更节省内存。...与C语言类似,C++也定义了自己的标准,同时提供相关支持库,称为C++运行时库。 准备工作 由于GCC工具链主要是在Linux环境中进行使用,因此本文也将以Linux系统作为工作环境。...,生成汇编程序 上述命令生成的汇编程序hello.s的代码片段如下所示,其全部为汇编代码。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。

    1.9K30

    万万没想到,一个可执行文件原来包含了这么多信息!

    比如你在86平台编译arm的程序,最终生成的可执行文件到底能不能运行在arm平台呢?通过Machine字段就可以很容易确定,从这里可以看到,它是运行在x86平台的。...同样的,当你在交叉编译的时候,发现总有一个库链接不上,但是库又存在,不妨看看这个库和你要编译的平台是否匹配。 链接了哪些动态库? 编好的程序依赖了哪些动态库呢?可不要放到另外一个平台就起不来啊。...瞅瞅: $ ldd main linux-vdso.so.1 => (0x00007ffe750e7000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so...so找不到,不妨看看它链接的动态库在什么位置,你的机器上到底有没有吧。...我们的hello,字符串放在了这里。 总结 本文仅列出了一些比较常见的可执行文中能读到的信息,欢迎补充。 思考 对于a和b,它们的内存存储区域是一样的吗?为什么?

    70220

    【Linux】--- Linux编译器-gccg++、调试器-gdb、项目自动化构建工具-makeMakefile 使用

    链接(生成可执行文件或库文件): 实例: gcc hello.o –o hello。在成功编译之后,就进入了链接阶段,最后形成可执行程序。 那么为什么会有这些过程呢? 这就要说到编程语言的历史了。...最后的答案是:系统把这些函数实现都被做到名为 libc.so.6的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径 /usr/lib下进行查找,也就是链接到 libc.so.6库函数中去,这样就能实现函数...函数库一般分为静态库和动态库两种。 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。...动态库一般后缀名为".so",如前面所述的 libc.so.6就是动态库。gcc在编译时默认使用动态库。完成了链接之后,gcc就可以生成可执行文件,如下所示。...Visual C++的nmake,Linux下GNU的make。

    43320

    深度解析Linux中的编译器gccg++

    ) 输入命令gcc -c code.s -o code.o -c的意思是开始进行程序的翻译,汇编完成就停下来 我们生成的code.o文件是不能执行的,并且可以重定位目标二进制文件的 4、链接(生成可执行文件或者库文件...,直接拷贝到我们的可执行程序中 所以这就是被为什么我们采用静态链接时候我们的可执行程序的大小比动态链接的时候大了 因为静态链接不再依赖任何库 我们这里的图比较形象 将我们视为可执行程序 学校视作内存 网吧视作动态库...,那么我们所有的可执行文件都运行不了了 静态链接的优点:一但编译好不依赖任何库,浪费磁盘和内存空间 在 Linux 系统中,gcc 和 g++ 是 GNU 编译器集合中的核心工具,分别用于编译 C 和...静态库 特点: 静态库在编译时被直接嵌入到可执行文件中,生成的二进制文件是独立的。 文件后缀通常为 .a。...五、工具补充 查看目标文件/库文件的符号表: nm file.o nm libmylib.a nm libmylib.so 查看动态库依赖: ldd output 输出依赖的动态库列表及路径。

    13510

    Linux 程序编译过程详解

    为了便于初学者理解,在此介绍动态库与静态库的概念:如果要将多个.o目标文件生成一个库文件,则存在两种类型的库,一种是静态库,另一种是动态库。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。如果一个系统中存在多个需要同时运行的程序且这些程序之间存在共享库,那么采用动态库的形式将更节省内存。...与C语言类似,C++也定义了自己的标准,同时提供相关支持库,称为C++运行时库。准备工作由于GCC工具链主要是在Linux环境中进行使用,因此本文也将以Linux系统作为工作环境。...// GCC的选项-S使GCC在执行完编译后停止,生成汇编程序上述命令生成的汇编程序hello.s的代码片段如下所示,其全部为汇编代码。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。

    1.9K30
    领券