每个C++开发者都应该了解关于链接的内容

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文件?当我将一个.LIB文件与我的对象文件进行链接时,是否所有东西都被复制进去,还是只有我使用的对象文件?何时应该构建DLL / so文件而不是静态链接?我必须了解对象文件的内部结构才能解决常见问题吗?我需要了解哪些关于名称修饰方面的知识?何时相关?如果其中一个dll加载旧的msvcrt,我可以将几个不同的标准库与我的项目链接在一起吗?等等。

问题

显然,我并不希望一次回答上面列出的所有问题。我只需要知道从哪里开始。是否有像“每个程序员都应该了解的关于内存的事情”这样的资源,可以谈论链接?所以,我需要学习的资源和你对我学习链接过程应该走向哪个方向的见解。

每个开发人员应该了解哪些与链接相关的东西?


C++语言目前不支持模块和库,因此这种支持通常是通过实现特定的语言扩展来完成的。最好针对特定的操作系统和编译器提出同样的问题。 - Öö Tiib
这个做法在posix和windows中非常相似。你有.lib/.a文件,在两个系统中都有.dll和.so文件。你在两个系统上都会遇到“未定义引用”错误。目标文件格式不同,但有很多共同点。这个问题并不是关于官方C++文档对于链接所说的内容,我知道标准说链接是“实现细节”。而是关于C++领域中常见的链接实践。 - Klaufir
1
在Windows中,您可能需要将诸如__declspec(dllexport)之类的内容编写到C++代码中,在Unix中,这可能是支持正确链接的__attribute__((__visibility__("default")))之类的东西。 - Öö Tiib
2
如果你想要了解链接是如何工作的,请直接提问“C++中链接的工作原理”即可。你真的不需要写一整篇关于所有你已知和遇到过问题的事情,还有你的堂叔——他曾经......等等。这些都是无关紧要的,只会淡化问题并让人们想要关闭它。我不会为你编辑它,因为那将是一个重大的改变,但我真的相信如果你只专注于你的问题而不是展开阐述,你会得到更好的答案。 - jalf
好的。关于这个问题的后续:https://dev59.com/WGct5IYBdhLWcg3wZcmL - Klaufir
4个回答

2
有很多资源。
我猜对于“初学者”来说可能会有些压力。
至于“Windows”,你可以从这里开始: 我还想推荐这个: 希望这有所帮助 :)
PS:
澄清一下:
您想知道如何将您“编译”(转换为机器代码)的位组合在一起通过“链接”。这是一个完全合理的问题 :)
了解机器代码与“运行程序”的关系也有所帮助...
...以及“运行程序”如何使用来自(静态).exe 的某些位和来自动态运行时(.dll 或“动态链接库”的其他位)。
所有这些细节通常都是特定于平台和操作系统的。
因此出现了(不同的)链接。
再次,我希望所有这些对您的初始问题有所帮助。

1
我强烈推荐阅读John Levine的《"连接器和加载程序" 》。书中大部分内容可以在此 在线获得,但你应该购买这本书并支持作者。这本书教给了我很多关于如何深入挖掘二进制文件的知识。

0
如果你要开始编程/C++,我建议首先了解静态和动态库的工作原理,并制作一些关于如何创建.dll和.lib的教程。对此,Google是你最好的朋友:例如我找到了这个链接http://www.bogotobogo.com/cplusplus/libraries.php
需要注意的是,制作库的方法取决于你使用的C++编译器。我能想到的有集成开发环境(IDE)例如Visual Studio或者gnu C++编译器。

0

关于编程,你需要了解的一个重点是ODR,特别是对于inline符号的含义。

维基百科条目可能是一个不错的起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接