关于链接如何工作的信息很少。此外,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,我可以将几个不同的标准库链接到我的项目吗?等
显然,我不希望一次性回答上述所有问题。我只需要知道从哪里开始。是否存在像"每个程序员应该了解的关于内存的资源",哪个谈到链接?因此,我需要资源来学习,以及您应该从哪个方向了解链接过程。
每个开发人员应该了解哪些关于链接的内容?
答案 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可能是一个好的开始。