24

我有两个文件,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

4 回答 4

35

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

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”,那么这种情况会更有意义。

于 2013-09-13T03:01:53.173 回答
21

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


两个附加说明。首先,modules.o是一个目标文件,它不应该包含在 C 源文件中。其次,我们不能让 C 文件有.o扩展名。.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
$
于 2013-09-13T02:32:43.443 回答
2

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

于 2013-09-13T02:32:36.273 回答
2
program: main.o 
    gcc -o main main.c anotherSource.c

这对我有用。

于 2020-05-19T05:39:48.540 回答