每个C ++开发人员应该知道关于链接的内容

时间:2012-08-24 22:45:31

标签: c++ linker

问题

关于链接如何工作的信息很少。此外,IDE会隐藏编译的详细信息,如果您的项目存在与链接相关的问题,那将是一件非常痛苦的事。

通常C ++书籍告诉我

C++ code --> preprocessed c++ code --> object code

但他们真的没有详细讨论普通开发人员应该知道的关于链接的事情,尽管链接错误很常见。一个新的C ++程序员应该如何知道如何处理如下错误?

XmlRpcSocket.o:XmlRpcSocket.cpp:(.text+0x48b): undefined reference to `WSAGetLastError@0'

但是这个问题没有具体关于这个问题(-lwsock32解决了它)。问题是缺乏关于链接的一般知识。我的大学C ++讲师谈到了将一张幻灯片的时间与一些黑盒子连接在一起。

此外,关于链接如何工作的资源很少,我认识的大多数人仍然认为链接是一个黑盒操作。我所学到的关于链接的知识是通过实验,并且有点"在路上选择了它,但是这种方法的问题在于它引发的问题多于答案。

例如:我知道.LIB文件是库文件,它们是目标文件包。 现在,应该如何构建和使用.LIB文件?什么时候需要使用.LIB文件?当我建立静态.LIB文件或引用DLL的文件时?当我将.LIB文件与我的目标文件链接时,是否所有内容都被复制,或者只是我使用的目标文件?我应该何时构建DLL / so文件而不是静态链接?我是否必须了解目标文件的内部结构以解决常见问题?关于名称修改我需要知道些什么?什么时候相关?如果其中一个dll加载旧的msvcrt,我可以将几个不同的标准库链接到我的项目吗?等

问题

显然,我不希望一次性回答上述所有问题。我只需要知道从哪里开始。是否存在像"每个程序员应该了解的关于内存的资源",哪个谈到链接?因此,我需要资源来学习,以及您应该从哪个方向了解链接过程。

每个开发人员应该了解哪些关于链接的内容?

4 个答案:

答案 0 :(得分:2)

资源有 TONS

我想对于初学者而言,这可能是压倒性的。 ;)

至于" Windows",你可能会比从这里开始更糟糕:

我也推荐这个:

'希望有所帮助:)

PS:

澄清:

  • 你想知道你编辑的比特是怎样的#34; (进入机器代码)所有这些都是通过"链接"来实现的。一个完全公平的问题:)

  • 了解机器代码如何与正在运行的程序进行比较也很有帮助#34; ...

  • ......以及"运行程序"使用来自(静态).exe的一些位,以及来自动态运行时的其他位(.dll'或动态链接库)。

  • 所有这些细节通常都是完全基于平台和操作系统的

  • 因此(各种)链接。

同样,我希望所有这些都有助于您的初始问题。

答案 1 :(得分:1)

我强烈推荐阅读John Levine的"Linkers & Loaders"。这本书的大部分内容都是available online here,但你应该买这本书并支持作者。这本书教会了我很多关于如何深入挖掘二进制文件的内容。

答案 2 :(得分:0)

如果您是从编程/ C ++开始,我将首先深入了解静态和动态库的工作方式,并制作一些教程来制作.dll和.lib。谷歌是你最好的朋友:我只是找到这个:http://www.bogotobogo.com/cplusplus/libraries.php

请注意,创建lib的方式取决于您的C ++编译器。我最喜欢的是像Visual Studio或gnu C ++编译器这样的集成开发环境(IDE)。

答案 3 :(得分:0)

您应该了解的一点是ODR,尤其是inline符号的含义。

wikipedia entry可能是一个好的开始。