文件类型

编译 C 程序需要你使用五种文件:

  1. 源文件 :这些文件包含函数定义,其名称按惯例以 .c 结尾。注意:.cc.cpp 是 C++文件; 不是 C 文件。
    例如,foo.c

  2. 头文件 :这些文件包含函数原型和各种预处理器语句(见下文)。它们用于允许源代码文件访问外部定义的函数。头文件按照惯例以 .h 结尾。
    例如,foo.h

  3. 目标文件 :这些文件是作为编译器的输出生成的。它们由二进制形式的函数定义组成,但它们本身不可执行。按照惯例,对象文件以 .o 结尾,虽然在某些操作系统(例如 Windows,MS-DOS)上,它们通常以 .obj 结尾。
    例如,foo.o foo.obj

  4. 二进制可执行文件 :这些是作为名为链接器的程序的输出生成的。链接器将许多目标文件链接在一起以生成可以直接执行的二进制文件。二进制可执行文件在 Unix 操作系统上没有特殊后缀,尽管它们通常在 Windows 上以 .exe 结尾。
    例如,foo foo.exe

  5. :库是一个已编译的二进制文件,但它本身并不是一个可执行文件(即库中没有 main() 函数)。库包含可由多个程序使用的函数。库应附带头文件,其中包含库中所有函数的原型; 应在任何使用该库的源文件中引用这些头文件(例如; #include <library.h>)。然后需要将链接器引用到库中,以便程序可以成功编译。有两种类型的库:静态和动态。

    • 静态库 :静态库(用于 POSIX 系统的 .a 文件和用于 Windows 的 .lib 文件 - 不要与 DLL 导入库文件混淆,也使用 .lib 扩展名)静态内置到程序中。静态库的优点是程序确切地知道使用哪个版本的库。另一方面,可执行文件的大小更大,因为包含了所有使用的库函数。
      例如,libfoo.a foo.lib
    • 动态库 :动态库(大多数 POSIX 系统的 .so 文件,OSX 的 .dylib 和 Windows 的 .dll 文件)在程序运行时动态链接。这些有时也被称为共享库,因为许多程序可以共享一个库映像。如果多个应用程序正在使用库,则动态库具有占用更少磁盘空间的优势。此外,它们允许库更新(错误修复),而无需重建可执行文件。
      例如,foo.so foo.dylib foo.dll