![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++编译系统
文章平均质量分 92
介绍编译,链接,CMake等C++编译相关的知识
mo4776
这个作者很懒,什么都没留下…
展开
-
连接器处理重复符号(二)具体不同地址的全局对象
方法,它将输出单例对象的地址。最终输出的结果是每个对象的地址都不相同。这显然不符合我们的预期。就好比原本有一个封装了日志功能的静态,被多个动态库链接使用,本意是都使用同一个日志全局对象输出日志,结果缺产生了多个日志对象,这显然是不符合业务需求的。,它会包含静态库中的所有符号,默认情况下这些静态库都会标示为导出符号,通过连接器脚本。在动态库,可执行程序中都调用了单例对象。,输出如下,全局对象的地址各不同。将这些静态库符号隐藏,只导出符号。在下面这个例子中,可执行程序。,把它编译为一个静态库。原创 2023-05-02 11:26:10 · 715 阅读 · 1 评论 -
连接器重复符号处理(一)动态库重复符号处理规则
在日常开发工作中,经常会遇到符号重复定义的问题,这篇文章主要描述的是链接器在处理重复符号时的规则。在解析引用的过程中,最常发生的问题就是会出现重复符号,该问题发生在链接的最后阶段,具体为在所有可用符号列表中包含两个甚至更多同名符号,连接器就会报错,一般如下错误:./libsecond.a(secondfile.o):在函数‘duplicateFunction(int)’中:/root/test/cf/secondfile.cpp:6: duplicateFunction(int) 的多重定义。原创 2023-04-24 16:12:31 · 1309 阅读 · 0 评论 -
C/C++程序编译与链接(五) 定位库文件
只有动态库在程序运行时加载,静态库是构建时就已经链接到程序中。原创 2023-03-21 19:07:56 · 315 阅读 · 0 评论 -
C/C++程序编译与链接(四) 创建动态库
其实站在开发者的角度,认为API与ABI是应该等价的,代码里的接口匹配,难道编译后,二进制文件中的接口对应的符号还不匹配吗?是的,对C++来说是要需要关注这些问题。原创 2023-03-11 10:01:58 · 1581 阅读 · 0 评论 -
C/C++程序编译与链接(三) 动态库的概念
对一些核心动态库(比如libc.so,libstd++.so等),这些都不是问题,因为这些库的位置,都已经被预先内置到系统中。但是对我们自己依赖动态库的程序,要想运行必须有两点:1. 操作系统中有程序需要的动态库。构建动态库生成的二进制文件本质上与可执行文件是相同的,唯一的区别在与动态库缺少了让其独立执行的启动程例程。运行时需要将可执行程序的符号正确解析到正确的地址上,这个地址是动态库所映射到进程内存映射中的地址。与路径一样,对操作系统自身的功能动态库,版本都是适配于操作系统的最合适的版本。原创 2023-03-06 08:22:45 · 440 阅读 · 0 评论 -
C/C++程序编译与链接(二) 静态库的概念及使用
静态库和动态库是我们都非常熟悉的概念,它们的产生根本目的就是为了代码重用。我们平常在工作中也会使用各种库,有静态库,动态库。虽然它们的目的都一致的,但是两种形式的库还是有本质上的区别,静态库是一种比较原始,简单的代码复用方式,而动态库相对就复杂些。所以如果静态库中某个方法或变量变动,意味着整个客户程序都需要重新链接,不管客户程序是否有改动(即使只是实现方式的变动,而不是方法名字,签名参数的变动)。我们有时需要在传递给链接器的静态库多次添加同一个静态库。参数是指定库的路径,静态库是在当前目录下,所以是。原创 2023-02-28 08:28:46 · 562 阅读 · 0 评论 -
C/C++程序编译与链接(一) 编译与链接的概念
编译器本质上是将源代码中的高级语言翻译成低级语言,比如翻译成intel x86平台的汇编代码。上面简单的描述编译器的主要工作后,可以体会到编译器的复杂性,通常一个大型的C/C++项目有成千上万上个源文件,源文件间的调用关系错中复杂,编译器生成正确的汇编代码,要理解这些调用关系产生正确符号地址等,再生成正确的执行文件,还要讲究速度。这样简单的想想都很复杂。平常我们认为C/C++复杂,认为它们是比较低级的语言,但是在它们背后,编译器还是做了大量的工作。那么对python,java这样简洁,高效的语言。原创 2023-02-27 09:52:28 · 1847 阅读 · 0 评论 -
多个gcc/glibc版本的共存及指定gcc版本的编译
文章目录需求背景知识什么是glibc,libc,glib依赖关系方法查看glibc版本查找glibc库的位置查看glibc API的版本libstdc++查找```libstdc++.so```的位置查看```libstdc++```的版本查看系统```libstdc++```API的版本libstdc++,glibc的关系确定程序需要的```glibc/libstdc++```的版本解决步骤编译安装多个gcc/glibc版本共存指定gcc/g++,glibc的版本进行编译程序运行机器上的依赖总结这篇文章原创 2021-08-21 12:00:50 · 34420 阅读 · 2 评论