首页 / 知识
关于链接器:为什么链接库的顺序有时会导致GCC错误?
2023-04-14 06:53:00

Why does the order in which libraries are linked sometimes cause errors in GCC?为什么库链接的顺序有时会导致GCC错误? (请参阅此答案的历史记录以获取更详细的文本,但我现在认为读者更容易看到真正的命令行。) sub> 以下所有命令共享的公共文件
链接到静态库
链接器从左向右搜索,并记录未解析的符号。如果库解析符号,它将获取该库的目标文件来解析符号(在这种情况下,bb超出了libb.a)。 静态库相互依赖的工作方式相同 - 需要符号的库必须是第一个,然后是解析符号的库。
如果静态库依赖于另一个库,但另一个库再次依赖于前一个库,则存在一个循环。您可以通过用 链接到动态库
它在这里是一样的 - 库必须遵循程序的目标文件。与静态库相比,这里的区别在于您无需关心库之间的依赖关系,因为动态库本身会对其依赖关系进行排序。
最近的一些发行版显然默认使用
在创建前者时,省略
如果您错过了指定
如果您现在查看二进制文件的依赖关系,您会注意到二进制文件本身也依赖于 GNU ld链接器是所谓的智能链接器。它将跟踪前面的静态库使用的函数,永久地抛弃那些未在其查找表中使用的函数。结果是,如果过早链接静态库,那么稍后链接行上的静态库将不再提供该库中的函数。 典型的UNIX链接器从左到右工作,因此将所有依赖库放在左侧,将满足这些依赖性的库放在链接行的右侧。您可能会发现某些库依赖于其他库,而同时其他库依赖于它们。这是它变得复杂的地方。谈到循环引用,修复代码! 这是一个示例,用于说明在涉及静态库时GCC的工作原理。所以我们假设我们有以下场景:
我们如何链接这个? (注意:使用gcc 4.3.4编译Cygwin的示例)
如果将 在Qt上这意味着添加:
节省了大量的时间,它似乎没有减慢连接速度(这比编译所花费的时间少得多)。 另一种方法是两次指定库列表:
这样做,您不必打扰正确的序列,因为参考将在第二个块中解析。 您可以使用-Xlinker选项。
几乎等于
小心! 这是一个例子:调试库有一个调试例程,但是非调试 库有一个弱版本。您必须放置调试库 首先在组中,您将解析为非调试版本。 一个快速的提示让我感到高兴:如果您将链接器调用为"gcc"或"g ++",那么使用"--start-group"和"--end-group"将不会将这些选项传递给 链接器 - 也不会标记错误。 如果您的库顺序错误,它将使未定义符号的链接失败。 您需要将它们写为"-Wl, - start-group"等,以告诉GCC将参数传递给链接器。 我已经看到了很多,我们的一些模块链接超过100个代码库以及系统和第三方库。 根据不同的链接器HP / Intel / GCC / SUN / SGI / IBM / etc,您可以获得未解析的函数/变量等,在某些平台上,您必须两次列出库。 在大多数情况下,我们使用库的结构化层次结构,核心,平台,不同的抽象层,但对于某些系统,您仍然必须使用link命令中的顺序。 一旦你找到解决方案文档,下一个开发人员就不必再次解决它了。 我的老讲师曾经说过,"高凝聚力和低耦合",今天仍然如此。 链接顺序当然重要,至少在某些平台上。我看到与错误顺序的库链接的应用程序的崩溃(错误意味着A在B之前链接但B依赖于A)。 |
最新内容
相关内容
linux链接远程命令?
linux链接远程命令?,系统,地址,网络,密码,软件,名称,工具,服务,电脑,认证,如何远程连接linux服务器步骤一:登录Linux服务器。打开Xshell,新建会linux动态链接库命令?
linux动态链接库命令?,代码,项目,工程,电脑,网上,文件,程序,静态,命令,目录,如何在linux下写动态链接库并卖给别人1、执行qmake main.pro生成mlinux编辑文本命令行?
linux编辑文本命令行?,工作,系统,信息,状态,地址,命令,管理,标准,目录,文件,Linux文本操作常用命令linux常用命令有pwd命令、cd命令、ls命令、linux命令忽略错误?
linux命令忽略错误?,系统,地址,工作,信息,设备,命令,设计,灵活,观察,标准,linux命令问题,在使用ls命令时,能不能不让输出错误信息--pid=进程号linux查看文本的命令?
linux查看文本的命令?,系统,工作,标准,信息,命令,管理,数据,文件,目录,时间,Linux文件相关命令命令一:cat cat命令应该是在Linux中查看文件内容linux文本中插入命令?
linux文本中插入命令?,工作,地址,系统,命令,信息,第一,工具,地方,密码,情况,Linux下常用文本处理命令简单说明使用file命令可以知道某个文件究linux文本撤销命令?
linux文本撤销命令?,系统,命令,信息,环境,状态,进程,程序,终端,快捷键,用户,求助linux中一句命令如何取消如果在命令行下使用gedit, 关闭程序窗linux命令中创建文本?
linux命令中创建文本?,系统,时间,文件,终端,名字,名称,发行,命令,文件夹,文件名,Linux命令如何创建,复制,打开,删除文件呢创建一个叫test的文linux删除硬链接命令?
linux删除硬链接命令?,工作,数据,系统,信息,链接,命令,设备,名称,不了,概念,linux怎么备份删除bin下的.sh命令1、dump命令 Linux dump命令用于linux文本编辑命令?
linux文本编辑命令?,工作,系统,地址,信息,环境,基础,命令,入口,网站,技术,linux系统常用操作命令linux常用命令有pwd命令、cd命令、ls命令、calinux创建软链接命令?
linux创建软链接命令?,工作,地址,位置,系统,信息,管理,服务,名字,链接,文件,如何在linux下创建硬链接软链接首先要弄清楚,在Linux系统中,内核为查找文本的linux命令?
查找文本的linux命令?,工具,命令,信息,系统,标准,文件,终端,情况,内容,字符串,linux下怎样在一个文件里面查找一个字符串?可以使用vim打开文件