代码之家  ›  专栏  ›  技术社区  ›  Aviv Cohn

C库是否与文本头文件以及二进制文件一起分发?

  •  2
  • Aviv Cohn  · 技术社区  · 5 年前

    mylibrary 通过做 #include <mylibrary.h> .

    头文件?或者是 mylibrary.h 从二进制库文件神奇地导出?

    这在不同的方法中是不同的,还是库是静态的还是动态的?

    2 回复  |  直到 5 年前
        1
  •  2
  •   zneak    4 年前

    头文件是必需的,因为编译后的二进制文件没有包含足够的信息供编译器使用。对于一些基于平台的变量,C二进制文件通常只有足够的元数据来按名称标识函数和全局变量。元数据不包括参数的类型(或计数)、返回类型、结构或联合定义、全局变量的类型或大小等。所有这些信息通常都编码在随库分发的标头中。(方便的是,它还意味着对开发人员隐藏头中不存在的任何内容;这允许您在库中创建用户不应直接调用的非公共函数。)

    在某些平台上,二进制文件甚至不包含函数名。相反,函数由它们在“序数表”中的位置引用。在这些平台上,库必须提供一个头文件、可执行二进制文件和一个附加文件,该文件从头文件中函数的名称转换为序数表中函数的索引,这样“void hello(void)”就可以是链接器的“序数表中索引3处的函数”。

    相反地,包含一个头并不(通常)链接到它所伴随的库。这在某些平台上是可能的,比如Windows,它有一些特殊的编译器指令,可以放在头中,告诉链接器链接到某个库,但这不是标准行为,你不能指望它在任何其他平台上都是现实。

    即将推出的是一些模块,它们提供了更好的用户体验,可以与二进制文件进行链接。模块是另一个可以用二进制文件打包的文件,上面写着“这里是我的所有头文件,这里是我的所有库”。使用模块,可以编写类似于“import MyLibrary;”的内容,并且可以获得所需的所有标题和链接器参数。我相信目前还没有C标准模块,C++是用C++ 20实现的。