【问题标题】:What is the difference between header and library file?头文件和库文件有什么区别?
【发布时间】:2020-08-19 09:01:37
【问题描述】:

我真的很困惑。 我无法理解库文件中的代码如何与头文件链接。 谁能帮帮我?

【问题讨论】:

  • 简短的回答是它不是。没有什么可以阻止您使用没有库的标头或没有标头的库。将两者分配在一起通常很方便,但这只是一种方便。
  • 您可以随意命名 lib 文件及其标题。它们之间没有语言强制的关系。它们只是任意名称。
  • 如果你用一些例子来说明你的困惑可能会有所帮助。我想你会得到很多不同的答案,因为没有人完全确定你对什么感到困惑。

标签: c++ c compilation compiler-construction


【解决方案1】:

暂时忘掉头文件,看看下面的程序:

// Forward declare foo()
void foo();

int main() {
  foo();
  return 0;
}

我可以很好地编译这个程序,但是如果我尝试链接它,我会收到如下错误:

有人向我保证存在一个名为 foo() 的函数,但我在任何地方都找不到。

现在,如果我将同一个程序链接到恰好提供 foo() 函数的库,那就没问题了。

标头只是以一种准确记录库内容的方式打包库(和其他一些东西)的所有前向声明的正式方式。但这只是一个约定。只要编译器从某处可以看到前向声明,那么这就是实际需要的全部内容。

记住:#include "path/to/file.h" 的字面意思是“复制粘贴该文件的内容到这里”。

所以这和我原来的程序差不多:

//foo.h
void foo();
//main.cpp

#include "foo.h"

int main() {
  foo();
  return 0;
}

【讨论】:

    【解决方案2】:

    .lib 文件包含放入其中的每个函数的所有代码。 头文件包含函数声明,以便编译器知道函数是什么。

    如果库文件中有如下函数:

    int myFunction(char c, int a) {
        //... Do something
    }
    

    头文件将包含声明:int myFunction(char c, int a) .lib 文件将包含 //... Do something part

    .lib 仅在编译期间使用,在运行时没有任何用途,因为它的内容(使用的内容)将被放入可执行文件中。

    更多信息:

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2010-11-10
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多