【问题标题】:What does it mean to link against something?链接到某物是什么意思?
【发布时间】:2014-04-20 01:49:05
【问题描述】:

我经常听到“链接库”这个词。 我是编译器的新手,因此是链接的,所以我想更多地理解这一点。

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

【问题讨论】:

    标签: c++ compiler-construction linker


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 标准头文件也是这样吗?例如,<iostream> 是否只包含声明而不包含实现?实现在哪里?
    • 大体相同,主要区别在于通常 C++ 编译器会自动告诉链接器链接到标准库(其中可能有不同的版本,例如静态/动态链接、调试/优化,...,根据编译器标志选择)。另外,请记住,许多头文件确实包含inline 函数的代码(以允许编译器实际执行内联)和模板(这就是标准库的大部分 STL 部分仅包含头文件的原因)。
    猜你喜欢
    • 2015-09-20
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2013-11-18
    • 2010-09-23
    相关资源
    最近更新 更多