【发布时间】:2014-04-20 01:49:05
【问题描述】:
我经常听到“链接库”这个词。 我是编译器的新手,因此是链接的,所以我想更多地理解这一点。
链接库是什么意思,什么时候不这样做会导致问题?
【问题讨论】:
标签: c++ compiler-construction linker
我经常听到“链接库”这个词。 我是编译器的新手,因此是链接的,所以我想更多地理解这一点。
链接库是什么意思,什么时候不这样做会导致问题?
【问题讨论】:
标签: c++ compiler-construction linker
库是包含已编译代码的“档案”。通常,您希望使用现成的库来使用一些您不想自己实现的功能(例如解码 JPEG、解析 XML、为您提供 GUI 小部件,等等)。
通常在 C 和 C++ 中使用库是这样的:您 #include 包含函数/类的库的一些标头 声明 - 即它们告诉编译器您需要执行的符号存在于某处,而没有实际提供他们的代码。每当您使用它们时,编译器都会在目标文件中放置一个占位符,表示该函数调用将在链接时解析,此时其余的目标模块将可用。
然后,在链接的那一刻,您必须指定要找到库函数的编译代码的实际库;然后,链接器会将编译后的代码与您的代码链接并生成最终的可执行文件(或者,对于动态库,它会添加相关信息以供加载程序在运行时执行动态链接)。
如果您没有指定要链接的库,链接器将有未解析的引用 - 即它会看到一些函数已声明,您在代码中使用了它们,但无处可找到它们的实现;这就是臭名昭著的“未定义引用错误”的原因。
请注意,所有这些过程与编译由多个 .cpp 文件组成的项目时通常发生的过程相同:每个 .cpp 都是独立编译的(仅通过原型知道其他函数中定义的函数,通常写在.h 文件中),最后将所有内容链接在一起以生成最终的可执行文件。
【讨论】:
<iostream> 是否只包含声明而不包含实现?实现在哪里?
inline 函数的代码(以允许编译器实际执行内联)和模板(这就是标准库的大部分 STL 部分仅包含头文件的原因)。