使用gcc编译多个C文件
我有两个文件, main.o
和modules.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
文件,它们是“标题”。 因此,如果您的主文件使用模块,那么您应该包含模块的头文件。