Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么输入库的指定顺序很重要?_Linux_Linker_Ld - Fatal编程技术网

Linux 为什么输入库的指定顺序很重要?

Linux 为什么输入库的指定顺序很重要?,linux,linker,ld,Linux,Linker,Ld,我对Linux编程相当陌生。你可以说我是一个Windows的家伙。因此,我将我的项目移植到Linux,这几乎让我发疯:我确信我已经用-l标志指定了所有依赖项,但我得到了“未解决的符号”错误。 然后我找到了这个话题,它解决了我的问题: 有人能解释一下为什么订单很重要,以及它到底有多重要吗?我很确定MSVC链接器不是这样的…来自“ 链接器的传统行为是在命令行上指定的库中从左到右搜索外部函数。这意味着包含函数定义的库应该出现在使用它的任何源文件或目标文件之后 我相信msvc链接器会对代码进行2次传递,

我对Linux编程相当陌生。你可以说我是一个Windows的家伙。因此,我将我的项目移植到Linux,这几乎让我发疯:我确信我已经用-l标志指定了所有依赖项,但我得到了“未解决的符号”错误。 然后我找到了这个话题,它解决了我的问题:

有人能解释一下为什么订单很重要,以及它到底有多重要吗?我很确定MSVC链接器不是这样的…

来自“

链接器的传统行为是在命令行上指定的库中从左到右搜索外部函数。这意味着包含函数定义的库应该出现在使用它的任何源文件或目标文件之后

我相信msvc链接器会对代码进行2次传递,因此即使在以不同的顺序指定库(引用缺失…)时,它们也可能能够解析符号

链接器的传统行为是在命令行上指定的库中从左到右搜索外部函数。这意味着包含函数定义的库应该出现在使用它的任何源文件或目标文件之后


我相信msvc链接器会对代码进行两次传递,因此即使在以不同的顺序指定库(引用缺失…)时,它们也可以解析符号。这是Unix链接器的工作方式,因为很久以前。。。请参见

这是Unix链接器的工作方式,很久以前。。。请参见

一个简单的示例将让您了解为什么一次性Unix链接器关心顺序

假设您有main.o(由main.cpp生成)和库libx.a(无依赖项)以及liby.a(依赖于称为newRefX的libx)

如果链接器按此顺序运行,则可以将链接器从1变为3:

  • main.o refX=未定义,refY=未定义
  • liby.arefX=undef,refY=def,newRefX=undef
  • libx.a refX=def,refY=def,newRefX=def
  • 但是,如果链接器按此顺序运行,您将遇到newRefX的问题:

  • main.o refX=未定义,refY=未定义
  • libx.a refX=def,refY=undef
  • liby.arefX=def,refY=def,newRefX=unde

  • 因此,您可以看到您希望最低级别的库(不依赖于其他库的库)排在最后。

    一个简单的示例将让您了解为什么单级Unix链接器关心顺序

    假设您有main.o(由main.cpp生成)和库libx.a(无依赖项)以及liby.a(依赖于称为newRefX的libx)

    如果链接器按此顺序运行,则可以将链接器从1变为3:

  • main.o refX=未定义,refY=未定义
  • liby.arefX=undef,refY=def,newRefX=undef
  • libx.a refX=def,refY=def,newRefX=def
  • 但是,如果链接器按此顺序运行,您将遇到newRefX的问题:

  • main.o refX=未定义,refY=未定义
  • libx.a refX=def,refY=undef
  • liby.arefX=def,refY=def,newRefX=unde
  • 因此,您可以看到,您希望最低级别的库(不依赖于其他库的库)是最后一个