如果我有一个List.h
包含与列表相关的函数原型的头文件,则函数的定义位于源文件(c 文件)List.c
中。List.c
文件和main.c
文件(或代表主程序的任何源文件)都包含该文件List.h
。现在主程序有了列表函数的原型,但是函数的定义是如何包含在主程序中的,而文件中没有包含List.c
文件main.c
呢?这与List.h
和List.c
文件具有相同的名称无关。
我在Windows上工作并使用MS Visual Studio。
如果我有一个List.h
包含与列表相关的函数原型的头文件,则函数的定义位于源文件(c 文件)List.c
中。List.c
文件和main.c
文件(或代表主程序的任何源文件)都包含该文件List.h
。现在主程序有了列表函数的原型,但是函数的定义是如何包含在主程序中的,而文件中没有包含List.c
文件main.c
呢?这与List.h
和List.c
文件具有相同的名称无关。
我在Windows上工作并使用MS Visual Studio。
对于您的场景,您编译List.c
为List.o
(或者List.obj
如果您在 Windows 上工作),然后编译main.c
为main.o
. 然后再次运行编译器以将两个目标文件以及任何其他必要的库链接在一起。
如果您使用 GCC(来自 GNU Compiler Collection 的 GNU C 编译器),那么您可以使用:
gcc -Wall -Werror -std=c11 -c List.c
gcc -Wall -Werror -std=c11 -c main.c
gcc -Wall -Werror -std=c11 -o program main.o list.o
如果您需要指定库,您可以在目标文件之后添加它们。
您可能也可以使用 自动执行所有这些操作makefile
。
它们是分开编译的。编译后,大多数编译器生成包含可执行代码、重定位、符号、调试和一些其他信息的目标文件。这些目标文件接下来由链接器程序“合并”在一起,该程序使用来自目标文件的信息来创建正确的可执行文件。
这当然是一个非常简化的描述,如果您想了解更多信息,您应该在互联网上阅读更多相关信息。