使用gcc编译多个C文件

我有两个文件, main.omodules.o ,我正在尝试编译它们,以便main.o可以调用modules.o函数。 我被明确告知不要尝试#include module.o 。 我真的不知道我应该做什么。 我尝试了几个不同版本的gcc (例如gcc -xc driver main.o modules.o ),但我没有得到任何工作:编译器不断返回

 error: called object is not a function 

.o文件是我的源代码文件(我被指示将我的源代码放在扩展名为.o文件中。)我该怎么做才能编译它?

您应该将要从modules.c调用到main.c的函数定义为头文件,比如modules.h,并将该头文件包含在main.c中。 获得头文件后,请将两个文件一起编译:“gcc main.c modules.c -o output”

另外两个笔记。 首先,modules.o是一个目标文件,它不应该包含在C源文件中。 其次,我们不能让C文件有.o扩展名。 在编译.o文件时,您应该实际上遇到错误。 就像是:

 $ cat to int main() { int x = 1; return 0; } $ $ gcc to ld: warning: in to, file is not of required architecture Undefined symbols: "_main", referenced from: start in crt1.10.6.o ld: symbol(s) not found collect2: ld returned 1 exit status $ 

如果您有两个源文件,则可以将它们编译为目标文件而不进行链接,如下所示:

 gcc main.c -o main.o -c gcc module.c -o module.o -c 

-c标志告诉编译器在编译阶段后停止,而不进行链接。 然后,您可以将两个目标文件链接为:

 gcc -o myprog main.o module.o 

这都是完全正常的行为,您通常会将makefile分别编译并在最后链接它们,因此每次更改其中一个源文件时都不必重新编译每个源文件。

谈论main.o “调用函数in” module.o非常好,但.o文件不是文件,它是一个编译的目标文件。 如果“将我的源代码放在扩展名为.o文件中”实际上意味着“将我的源代码编译成扩展名为.o文件”,那么这种情况会更有意义。

你应该包括.h文件,它们是“标题”。 因此,如果您的主文件使用模块,那么您应该包含模块的头文件。