【问题标题】:Isn't dependencies linking enough?依赖关系还不够吗?
【发布时间】:2011-03-01 11:31:46
【问题描述】:

前几天在 Visual Studio (C++) 中,我试图构建一些示例代码,但它不起作用,即使我指向正确的 include 和 lib 目录(我遇到链接器错误)。

我问了一位朋友,他通过在项目设置的常规属性->链接器->输入字段中指定必要的 .lib 文件来解决问题。

我的问题:

仅仅指向包含 .lib 文件的目录还不够吗?是否需要明确告诉链接器要链接哪些 lib 文件?

通过在additional dependencies 字段中列出 .lib 文件,我是否准确指定了哪些静态库被内置到 exe 中?如果答案是肯定的,那么这些是唯一内置到 exe 中的 lib 文件吗?为什么叫additional依赖?还有其他地方可以指定要包含的 lib 文件吗?我曾经认为这是通过包含必要的头文件来完成的。

【问题讨论】:

    标签: visual-studio dependencies static-libraries


    【解决方案1】:

    这是正确的,简单地指向一个目录不会导致该目录中的 .libs 被链接(考虑 Visual Studio 'lib' 文件夹的情况:我的版本中有 60 个文件:想象一下,如果他们都链接了!)

    之所以称为“附加”,是因为通常有标准 C++ 运行时会自动链接。各种#pragmas 也会导致库自动链接(这是 boost 之类的库)。

    【讨论】:

      【解决方案2】:

      在您的源代码中包含标头可以使编译器可以使用该标头中的声明。如果编译器找不到您使用的库函数(常量、宏等)的声明,它就无法生成引用该函数的目标代码。

      一旦编译成功,您就会得到包含一堆符号的目标代码。为了使目标代码有用,这些符号实际上需要引用某些东西。这就是链接器的作用——它将您刚刚编译的代码中的符号解析为您正在使用的二进制库中的相应目标代码。

      所以,是的,您确实需要告诉链接器要链接哪些 .lib 文件——类似于您告诉编译器(通过您的#include 指令)要引用哪些头文件。如果链接器无法解析符号,则链接将失败(我猜这是您遇到的链接器错误)。

      我实际上并没有使用 Visual Studio,但根据this MSDN article,VS 默认链接到 LIBC.LIB 和一大堆其他库。如果您正在使用默认情况下未链接的其他静态库,则这是一个额外的依赖项。

      【讨论】:

        猜你喜欢
        • 2015-12-28
        • 2023-03-04
        • 1970-01-01
        • 2016-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多