我有两个文件main.o
和modules.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
的文件中。)我该怎么做才能编译它?
答案 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.c
到modules.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
这对我有用。