【问题标题】:Visual Studio: What exactly are lib files (used for)?Visual Studio:lib 文件(用于)到底是什么?
【发布时间】:2010-03-03 21:21:54
【问题描述】:

我正在学习 C++,遇到了链接器明显使用的那些 *.lib 文件。我必须为 OpenGL 设置一些额外的依赖项。

  • 在这种情况下,库文件究竟是用来做什么的?
  • 它们的内容是什么?
  • 它们是如何生成的?
  • 关于它们还有什么值得了解的吗?

或者它们只是类似于 *.obj 文件的可重定位目标代码?

【问题讨论】:

    标签: c++ visual-studio


    【解决方案1】:

    简单来说,是的 - .lib 文件只是 .obj 文件的集合。

    在 Windows 上,您可以拥有两类 lib 文件,这有点复杂。
    静态 lib 文件本质上包含 .obj 的集合,并与您的程序链接以提供 .lib 中的所有功能。它们主要是为了方便您处理尽可能多的文件。

    还有 stub .lib 仅提供 .dll 文件中包含的函数的定义。 .lib 文件在编译时用于告诉编译器对函数的期望,但代码是在运行时从 dll 加载的。

    【讨论】:

    • 我认为这第二类 .libs 被称为“导入库”
    • 我想知道.lib 文件的意义是什么。它们似乎是多余的,导出的函数可能已经在应用程序调用的标头中。动态链接从来不需要它们,gcc 不需要它们,mingw 不需要它们,clang 不需要它们,那么为什么 VS 需要它们呢?幕后发生了什么?
    • @thomas 是的,链接器应该能够解析 dll 并获取所有信息。我不知道为什么 windows 不能这样做 - 它可能是 dll 格式的遗留问题。
    【解决方案2】:

    .lib 文件是“库”,可以说包含已编译代码的“集合”。因此,它是一种提供软件组件的方式,而不是例如泄露内部源代码。它们可以像可执行文件一样作为“构建”的“输出”生成。

    具体内容取决于您的平台/开发环境,但它们将包含链接器的符号以“连接”由例如提供的函数调用。库的头文件。

    一些库是“动态的”(Windows 上的 .DLL),这意味着函数调用的“挂钩”是在加载使用该库的可执行文件时设置的,允许在不重新构建可执行文件的情况下更改库实现。

    最后一件事。你说你正在学习 C++,一个常见的混淆点是,由 C++ 编译器生成的“符号”是“损坏的”(为了允许例如函数重载),并且这种“损坏”在不同的编译器之间没有标准化,所以库通常使用 C 作为库的“API”(就像 OpenGL),即使库可能在内部用 C++ 实现。

    我希望对 .lib 文件有所了解。快乐的 OpenGL 编码:-)

    【讨论】:

      【解决方案3】:

      这里面的库文件到底是什么 上下文用于?

      它们是编译和链接的代码,就像您的可执行文件一样。它们被称为静态库,其他程序可以在编译时链接到它们。对于 OpenGL,您链接到他们的库以构建可以运行 OpenGL 代码的可执行文件。动态库 (DLL) 是可执行文件链接的另一种类型的库,运行时除外。

      它们的内容是什么?

      静态库包含链接的目标代码,就像 exe 一样。 *.obj 文件是编译器为链接器生成的目标代码。

      它们是如何生成的?

      当编译器创建目标文件时,它会将工作传递给链接器。您可以在开发环境中创建它们,就像可执行文件一样。

      还有什么值得知道的 关于他们?

      是的,它们到处都在使用,所以习惯它们并没有什么坏处。

      【讨论】:

        猜你喜欢
        • 2015-07-09
        • 2016-03-12
        • 1970-01-01
        • 2017-10-10
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 2012-04-04
        • 2020-04-14
        相关资源
        最近更新 更多