链接器如何使用静态库解析引用

blzm742624643 blzm742624643     2023-01-06     119

关键词:

解析引用过程

  在符号解析阶段,链接器从左到右按照它们在编译器驱动程序命令行上的出现顺序来扫描可重定位目标文件和存到文件。

在这次扫描中,链接器维护一个可重定位目标文件的集合E(这个集合中的文件就是确定的最后合并成可执行文件的模块文件),

一个未解析的符合(即引用了但尚未定义的符号)集合U,以及一个已解析(前面已经定义但没有被引用)集合D

对于命令行上的每个文件 f ,链接器会判断 f 是一个目标文件还是存档文件。

1.判断输入文件类型

  如果是目标文件

    链接器将会把这个文件添加到集合E,并根据符号引用情况修改集合U和D的状态。然后处理下一个文件。

  如果是存档文件

    链接器将尝试匹配集合U中未解析的符号和存档文件成员定义的符号,如果存档文件的成员m定义了一个符号来解析U中的一个引用,

  那么久将m加入到集合E中,然后修改U和D的状态。对存档文件中的每个成员都重复这个过程,直到U和D不再发生变化,然后简单地丢弃

  不包含在集合E中的成员目标文件。然后链接器继续处理下一个文件。

2.判断集合U是否为空

  如果链接器扫描完命令行上的所以文件后,集合U仍不为空,则说明引用了未定义的符号,则链接器将会报错并终止程序。

  如果链接器扫描完命令行上的所以文件后,集合U仍为空,则将合并和重定位E中的目标文件,并输出可执行文件。

 

注意命令行上的库和目标文件的顺序

  一般将库放在命令行的结尾

  1.如果库之间是相互独立的,则可以以任意的顺序放在命令行的结尾处。

  2.如果库之间是相互依赖的关系,则必须对他们排序,使得对于每个被存档文件的成员外部引用的符号s,在命令行中至少有一个s的定义是在对s的引用之后的。

配置使用opencv静态链接库

配置opencv静态链接库需要用到:staticlib在配置链接器-》附加库目录时应该为staticlib的路径。同理若是利用动态链接库则只需要lib的路径: 动态链接库则使用lib,然而在使用staticlib的时候报了一些错误:无法解析的外部符号"p... 查看详情

如何静态链接到libstdc++.喜欢升级的gcc的朋友快来看看

参考技术Agcc默认使用动态库方式链接,找不到动态库才会去找静态库,若要使用静态库需给链接器指定参数-static。 参考技术Bgcc默认使用动态库方式链接,找不到动态库才会去找静态库,若要使用静态库需给链接器指定参数-stat... 查看详情

c语言学习笔记--动态库和静态库的使用

1.C语言中的链接器 (1)每个C语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件。 (2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接... 查看详情

学习笔记链接

链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载到内存并执行。链接可以执行于编译时,也就是在源代码被翻译成机器代码时;也可以执行于加载时,也就是在程序被加载器加载到内存并执... 查看详情

链接过程

链接器的意义链接器的主要作用是把各模块之间相互引用的部分处理好,使得各模块之间能够正确的衔接模块链接静态链接-由链接器在链接时将库的内容直接加入到可执行程序中Linux下静态库的创建和使用 -编译静态库源码... 查看详情

MFC 静态链接未解析的外部符号

】MFC静态链接未解析的外部符号【英文标题】:MFCStaticLinkingUnresolvedExternalSymbol【发布时间】:2013-12-2000:38:51【问题描述】:我正在尝试使用UseofMFC:UseMFCinaStaticLibrary构建自定义版本的GyazoWin,这会导致大量参考错误。如何安抚Visua... 查看详情

gcc同时使用动态和静态链接

...是每台机器都安装有libmysqlclient,所以我想把这个库静态链接到Nginx模块中,但又不想把mysqlclient引用的其他库也静态的链接进来。  我们知道gcc的-static选项可以使链接器执行静态链接。但简单地使用-static显得有些’暴力&rs... 查看详情

未定义弱函数的引用(静态库+gcc)(代码片段)

...正在使用ARMGCC进行编译,效果很好。我可以在其他项目中链接它,它确实可以正常工作。第二部分是问题,因为我想在项目中实现单元测试!为此,我为同一个驱动程序层静态库(带有STM32HAL代码的静态库)创建了另一个配置,... 查看详情

在 Xcode 中运行 iOS 单元测试时引用 _main 的链接器错误

】在Xcode中运行iOS单元测试时引用_main的链接器错误【英文标题】:Linkererrorreferringto_mainwhenrunningiOSunittestinXcode【发布时间】:2015-08-0719:39:14【问题描述】:我正在尝试在Xcode中运行与静态库链接的单元测试。这个静态库“libGSG”... 查看详情

c++学习(三四二)静态库动态库

库只是对象的集合,根据定义,这些对象尚未链接.链接器不用于创建库,因此,没有链接器选项是有道理的.静态库不做符号链接判断动态库做动态库在生成时提示undefinedreferenceto`curl_easy_init'静态库不提示静... 查看详情

与使用名称空间的外部库链接时,如何解决 C 中未定义的引用?

】与使用名称空间的外部库链接时,如何解决C中未定义的引用?【英文标题】:HowtosolveundefinedreferencesinCwhenlinkingwithanexternallibrarythatusesnamespace?【发布时间】:2014-08-0606:17:36【问题描述】:我正在将我的程序链接到一个外部静态... 查看详情

静态库的c ++链接器错误

】静态库的c++链接器错误【英文标题】:c++Linkererrorwithstaticlibrary【发布时间】:2018-06-0608:02:49【问题描述】:我正在尝试包含使用静态方法创建的静态库,但在尝试调用该方法时在运行时出现以下错误:[INFO][1528271039.635221775]:... 查看详情

链接静态库时链接器可以省略目标文件吗?

】链接静态库时链接器可以省略目标文件吗?【英文标题】:canlinkeromitobjectfilewhenlinkingstaticlib?【发布时间】:2010-12-0516:39:49【问题描述】:我有一个静态库(lib.a)和一个链接到它的程序。该库没有任何入口点,在使用它之前总是... 查看详情

在 C++ 程序上使用加载时或运行时动态链接时,如何在编译时解析引用?

】在C++程序上使用加载时或运行时动态链接时,如何在编译时解析引用?【英文标题】:Howreferencesareresolvedatcompiletimewhenusingload-timeorrun-timedynamiclinkingonC++programs?【发布时间】:2021-01-1522:45:58【问题描述】:我想我的问题很简单,... 查看详情

类加载机制深度解析(代码片段)

...据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用 初始化:对类的静态变量初始化为指定的值,执行静态代码块二、类加载器... 查看详情

静态和共享库链接器错误

】静态和共享库链接器错误【英文标题】:Staticandsharedlibrarieslinkererror【发布时间】:2013-04-1317:31:42【问题描述】:我正在使用NDK(Android的原生编译器工具)。所以,情况是这样的:Staticboost→Sharedhelpers↓SharedGameHelpers是一些用... 查看详情

读书笔记|《程序员的自我修养》-01前言(代码片段)

图片来自极客时间深入浅出计算机原理学习链接知识的意义理解链接将帮助你构建大型程序构建大型程序的程序员经常会遇到由于缺少模块、缺少库或者不兼容的库版本引起的连接器错误。除非你理解连接器是如何解析引用、什... 查看详情

无法使用解析库:解析链接器警告:文件是为不受支持的文件格式构建的

】无法使用解析库:解析链接器警告:文件是为不受支持的文件格式构建的【英文标题】:UnabletouseParselibrary:Parselinkerwarning:filewasbuiltforunsupportedfileformat【发布时间】:2013-12-0608:27:25【问题描述】:因此未加载符号并且我无法使... 查看详情