linux下g++链接动态库和静态库

这篇具有很好参考价值的文章主要介绍了linux下g++链接动态库和静态库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

头文件的作用:

include的作用就是复制内容到当前文件

井号开头的就是预处理指令,由预处理器处理,预处理阶段不关心代码,只处理预处理指令。

头文件主要 一是为了解决代码都写在一个文件太大了,二是把变量,结构体,函数声明这些固定的放在一起

函数只要声明了,第二个阶段(编译阶段)语法检查就能通过,如果没定义实现,则第四个阶段链接时会报错link失败

c++ 编译过程:

1阶段,预处理阶段, 处理代码中的预处理指令,比如复制include到当前文件

2阶段,编译阶段 6步: 扫描(词法分析)、语法分析、语义分析、源代码优化、代码生成、目标代码优化

3阶段,汇编,把正确的汇编代码汇编位二进制代码

4阶段,链接,这时候才会找头文件中声明的函数的定义,如果没有函数具体实现,就会报错

链接作用:

链接主要是把多个目标文件(.o文件) 放在一集合,解决每个目标之前引用的外部定义的变量、函数等地址引用问题

首先会合并目标文件,这里可以理解为代码合并,然后函数调用的地方需要修改指向具体的函数位置,也就是重定位的原因。

动态库

动态库一般编译都会有-fPIC选项,也就是位置无关代码,代码的地址都是相对位置,加载到程序内存中任何位置都能正确执行。

因为同一个动态库可能被不同的进程加载,加载位置肯定不一样。

动态库在每个阶段的作用,来自AI

动态库(.so文件)在程序运行阶段的作用是允许程序按需加载和卸载库文件,从而提高程序的灵活性和效率。
在编译阶段,程序只需要连接动态库的符号信息,而不需要动态库的实际代码,因此生成的可执行文件体积通常比静态链接库更小。在运行阶段,程序会通过动态链接器将程序中引用的动态库加载到内存中,并将其映射到程序地址空间中的适当位置,然后程序就可以使用动态库中的函数和变量了。
当程序不再需要库文件时,动态链接器会自动卸载它们,从而释放内存空间。此外,由于多个程序可以共享同一个动态库实例,因此动态库可以减少系统资源的消耗,并提高程序的运行效率。

动态库的用法

g++ main.o -L 动态库的路径 -I 头文件路径 -l动态库名字(名字不需要前缀lib和后缀.so) // 可以链接多个库和头文件目录

静态库:

静态库可以为通过ar程序将多个目标文件.o 打包成一个文件,没做什么改动。

链接时,主程序和静态库(多个目标文件一起链接)

静态库的用法:

g++ main.o -L 动态库的路径 -I 头文件路径 -l动态库名字(名字不需要前缀lib和后缀.so) -static // 可以链接多个库和头文件目录

之所以加-stacic, 是因为链接命令都一样,都是-L, -I, -l, 所以gcc默认使用动态库链接,连接不上再尝试用静态库链接

由于静态库是目标文件的合体,所以可以当作一个目标文件直接写名字进行链接: gcc main.c -I include lib/libTest.a -o app

还有一个就是静态库的-fPIC选项, 当一个动态库依赖这个静态库时,由于动态库肯定是位置无关的,此时静态库被链接进去,也应该是位置无关的
所以被依赖的静态库也要用-fPIC选项编译,通常也个选项是关闭的。

如果静态库没有-fPIC,编译动态库链接会提示一堆重定位错误 reloaction 字样的信息

如何查看是不是位置无关代码:

动态库 readelf -d xxx.so |grp REL 存在REL就是,一般都是

静态库 readelf --relocs xxx.a |grep GOT ,存在就时位置无关的。

总个节:

头文件就是代码, 只有编译的预处理阶段有用,运行时就没用了

静态库只在编译时有用

动态库运行时有用。

编译阶段:

自己写的动态库使用时除了gcc -L指定路径, 还可以放到环境变量路径下比如/bin, 但需要执行一次ldconfig更新动态库的缓存信息。

也可以临时设定LIBRARY_PATH: export LIBRARY_PATH=${LIBRARY_PATH}:./lib/xxx.so

运行阶段:

除了把动态库放入环境变量设置的路径下,比如/bin 还可以设置export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./lib/xxx.so文章来源地址https://www.toymoban.com/news/detail-701555.html

到了这里,关于linux下g++链接动态库和静态库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • windows下qt使用第三方库(静态链接库lib)、静态库和动态库区别、动态库的使用。

    这里主要是讲述windows下qt使用第三方库。 windows下qt使用第三方库(静态链接库lib)。 为了能够使测试更准确,首先自己用qt创建了一个已经封装好的lib库。 然后让另一个项目去链接这个lib静态库,并且去调用里面的方法。 目的: 使 untitled项目 能够使用 myllplib.lib 静态库,这

    2023年04月17日
    浏览(96)
  • 【Linux】动态库和静态库

    软链接 命令: ln -s 源文件名 目标文件名 软链接是独立连接文件的,他有自己的inode number,有自己的inode属性和内容。 软链接内部存放的是自己所指向文件的路径。 现实中,我们软链接的应用有,例如电脑桌面的快捷模式等。 inode number 不相同 硬链接 命令: ln 源文件目标文件

    2024年02月11日
    浏览(43)
  • Linux之静态库和动态库

    目录 一、前言 二、对于库的理解 三、静态库 四、动态库 五、动静态库的加载 在之前,我们讲了静态库和动态库,详情请跳转:静态库和动态库 下面我们将从工程师的角度,去了解静态库和动态库的形成过程,以及实现它们的制作。并且了解如何将自己的库交给别人,让别

    2024年01月20日
    浏览(36)
  • Linux下动态库和静态库编译实践

    之前写过JNI的文章,在JNI实践过程中,也涉及到对动态库/静态库的一些编译实践,这里统一记录一下。 注意 :-fPIC编译选项可使GCC生成位置无关代码,简单来说生成的代码中的函数与全局变量均为相对地址,通过GOT (Global offset table)来确定其位置,这种方式引入了一层额外的

    2024年01月17日
    浏览(43)
  • Linux中静态库和动态库的使用

    介绍: 库是一个二进制文件,包含的代码可被程序调用 标准C库、数学库、线程库… 库有源码,可下载后编译;也可以直接安装二进制包 位置一般放在:/lib /usr/lib 库的知识 库是事先编译好的,可以复用的代码 在os上运行的程序基本上都要使用库,使用库可以提高开发效率

    2024年01月25日
    浏览(38)
  • 如何在linux下制作静态库和动态库

    静态库顾名思义是静态的,即程序编译链接时,会把静态库的代码链接到可执行文件中。运行时不需要静态库(将静态库删了也能运行)。 相当于静态库的代码复制到了可执行文件中。 分别有如下add.c add.h sub.c sub.h四个文件格式。 首先把.c文件都编译成.o文件。使用下面命令

    2024年01月24日
    浏览(47)
  • Linux—Web服务器(静态、动态网站的搭建)

    1.1www所用的协议 HTTP超文本传输协议,是互联网上最广泛的一种网络协议,所有的www文件都必须遵守这个标准 它是建立在TCP上一种的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理

    2024年02月06日
    浏览(55)
  • Linux操作命令&静态库和动态库区别&大小端&孤儿僵尸进程

    cd:切换当前目录 ls:查看当前文件与目录 grep:通常与管道符命令一起使用,用于对一些命令的输出进行筛选和加工 cp:复制文件或文件夹 mv:移动文件或文件夹 rm:删除文件或文件夹 ps:查看进程情况 kill:向进程发送信号 tar:对文件进行打包 cat:查看文件内容 top:查看

    2024年02月16日
    浏览(42)
  • Linux下gcc编译,动态库和静态库,makefile,gdb调试

    展开头文件, 宏替换(变量宏、函数宏)、替换空格等 逐行检查程序中出现的语法错误,简单的逻辑错误 将 .s 汇编文件中所有的汇编指令翻译成二进制机器码(下面就是来了个截图,二进制显示了乱码) 将 .o 的目标文件,链接库文件、数据段合并,地址回填(把汇编里相

    2024年02月08日
    浏览(51)
  • 详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别

    关于gcc的使用方法可以参考下方链接博客: Linux下详解gcc编译过程(含代码示例) gcc使用教程 库是一种组件技术。 库里封装了数据和函数,提供给用户程序调用。 库只执行到第三阶段编译,没有链接。 库的使用可以使程序模块化,提高程序的编译速度,实现代码复用。

    2024年02月15日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包