使用gcc编译多个C文件

时间:2013-09-13 02:28:21

标签: c gcc

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

error: called object is not a function

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

4 个答案:

答案 0 :(得分:21)

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

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中讨论module.o”调用函数完全没问题,但.o文件不是文件,它是一个已编译的对象文件。如果“将我的源代码放在扩展名为.o的文件中”实际上意味着“将我的源代码编译为扩展名为.o的文件”,那么这种情况会更有意义。

答案 1 :(得分:9)

您应该将要从modules.c调用main.cmodules.h的函数定义为头文件,让我们说main.c,并将该头文件包含在gcc main.c modules.c -o output中。获得头文件后,请同时编译这两个文件:modules.o


另外两个注意事项。首先,.o是一个目标文件,它不应该包含在C源文件中。其次,我们不能让C文件具有.o扩展名。编译$ cat t.o int main() { int x = 1; return 0; } $ $ gcc t.o ld: warning: in t.o, 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 $ 文件时,实际上应该收到错误。类似的东西:

{{1}}

答案 2 :(得分:2)

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

答案 3 :(得分:1)

program: main.o 
    gcc -o main main.c anotherSource.c

这对我有用。