我经常听到“连接图书馆”一词。 我是编译器的新手,因此我很想了解这一点。

链接库是什么意思,什么时候不这样做会导致问题?

#1楼 票数:13 已采纳

库是一个包含已编译代码的“归档”。 通常,您希望使用现成的库来使用您不希望自己实现的某些功能(例如,解码JPEG,解析XML,为您提供GUI小部件,您可以命名)。

通常在C和C ++中使用库是这样的:你#include包含函数/类声明的库的一些头 - 即它们告诉编译器你需要的符号确实存在于某个地方,而不是实际提供它们的代码。 无论何时使用它们,编译器都会在目标文件中放置一个占位符,该占位符表示当其余的对象模块可用时,将在链接时解析该函数​​调用。

然后,在链接的那一刻,你必须指定实际的库,在那里找到库的函数的编译代码; 然后,链接器将链接此编译的代码并生成最终的可执行文件(或者,在动态库的情况下,它将为加载程序添加相关信息以在运行时执行动态链接)。

如果您没有指定要链接库,链接器将具有未解析的引用 - 即它将看到某些函数已声明,您在代码中使用它们,但它们的实现无处可寻; 这是臭名昭着的“未定义的参考错误”的原因。

请注意,所有这些过程都与编译由多个.cpp文件组成的项目时通常发生的过程相同:每个.cpp都是独立编译的(只知道其他人通过原型定义的函数,通常用.h文件编写) ),最后一切都链接在一起,以产生最终的可执行文件。

  ask by user2030677 translate from so

未解决问题?本站智能推荐:

3回复

链接器如何处理具有不同链接的变量?

在C和C ++中,我们可以操纵变量的链接。 共有三种链接:无链接,内部链接和外部链接。 我的问题可能与为什么将这些称为“链接”有关(与链接器有何关系)。 我知道链接器能够通过外部链接处理变量,因为对该变量的引用不限于单个翻译单元,因此也不限于单个目标文件。 在操作系统课程中通常会讨论其
2回复

链接器如何知道要链接的所有库?

来自http://www.learncpp.com/cpp-tutorial/19-header-files/ 链接器如何知道它需要包含标准运行时库,例如iostream中声明的函数的定义在其他地方不存在? 是否有一些映射可以促进链接过程? 重新措辞 - 如果我包含一些只包含函数声明
3回复

链接器是否将目标文件与其自身链接?

根据我在其他 SO 答案中读到的内容,例如this和this ,编译器将源代码转换为目标文件。 并且目标文件可能包含对需要由链接器解析的printf等printf引用。 我不明白的是,当声明和定义都存在于同一个文件中时,如下例所示,编译器或链接器是否解析对return1的引用? 或者这只是编译器优化
3回复

如何动态链接GCC对象?

我不确定这个问题的措词是否正确,或者我想要什么。 我有一个现有的GCC应用程序(如果重要的话,可为Cortex-M3编译)。 我要做的是创建可以调用现有应用程序的一小部分功能(只是一个方法,几个方法)。 我想将这几种方法放在特定的内存位置(我知道该怎么做)。 我不知道该怎么做,就是要
1回复

C++链接命令

我目前正在尝试使用 C++ 在 Windows 上制作一个基本的编译器。 我正在考虑如何将程序集转换为机器代码或 exe 文件。 如果这要由另一台计算机下载,我认为如果不附加汇编器和链接器(如 nasm 和 ld),它就无法工作。 有什么办法可以在不发送汇编器和链接器的情况下完成这项工作吗?
1回复

OpenCVcvSmooth链接器错误

我正在使用XCode 4进行开发,并且我将OpenCV库链接在一起以创建一些实验项目。 如果发现问题,请尝试编译以下行: 问题: 我认为这些库不是针对64位体系结构编译的... 注意: 通过MacPorts安装的库
1回复

将错误与MinGW和FLTK链接

我对C ++知之甚少,我习惯Java编译如此简单! 无论如何,我正在尝试使用Eclipse Kepler编写实现FLTK图形库的程序。 我认为我的编译器是MinGW。 这是我构建程序时输出的内容: http://hastebin.com/jefepobula.vbs 这是代码(这是
1回复

如何隐式链接库?

我有一个名为Aa的库,其.hpp文件名为A.hpp。 当程序需要使用该库时,它们#include“ A.hpp”,并像这样链接到它:g ++ test1.cpp Aa -o test1。 我希望只能像g ++ test1.cpp -o test1这样编译它,而无需在其中显式键入Aa,就像我不