6

问题

关于链接如何详细工作的信息很少。此外,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

4 回答 4

2

有大量资源。

我想这对于“初学者”来说可能是压倒性的;)

就“Windows”而言,您可能比从这里开始做得更糟:

我也推荐这个:

'希望有帮助:)

PS:

作为澄清:

  • 你想知道你已经“编译”(变成机器代码)的位是如何通过“链接”组合在一起的。一个完全公平的问题:)

  • 它还有助于了解该机器代码与“正在运行的程序”的关系......

  • ...以及“正在运行的程序”如何使用(静态).exe 中的一些位,以及来自动态运行时(.dll 或“动态链接库)的其他位。

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

  • 因此(不同的)链接。

再次,我希望所有这些对您最初的问题有所帮助。

于 2012-08-24T22:50:41.863 回答
1

我强烈推荐阅读 John Levine 的“Linkers & Loaders”。这本书的大部分内容都可以在这里在线获得,但你应该购买这本书并支持作者。这本书教会了我很多关于如何真正深入研究二进制文件的知识。

于 2012-08-25T02:16:39.050 回答
0

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

请注意,您制作库的方式取决于您的 C++ 编译器。我头上的那些是像 Visual Studio 或 gnu C++ 编译器这样的集成开发环境 (IDE)。

于 2012-08-24T22:59:13.637 回答
0

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

维基百科条目可能是一个好的开始。

于 2012-08-25T02:28:41.750 回答