用gcc编译多个C文件
我有两个文件,用gcc编译多个C文件,c,gcc,C,Gcc,我有两个文件,main.o和modules.o,我正试图编译它们,以便main.o可以调用modules.o中的函数。我被明确告知不要尝试#包括module.o。我真的不知道我应该做什么。我尝试了几个不同版本的gcc(例如gcc-xc driver main.o modules.o),但没有任何效果:编译器不断返回 error: called object is not a function .o文件是我的源代码文件(我被指示将我的源代码放在扩展名为.o的文件中),我该如何编译此文件?您应该包
main.o
和modules.o
,我正试图编译它们,以便main.o
可以调用modules.o
中的函数。我被明确告知不要尝试#包括module.o
。我真的不知道我应该做什么。我尝试了几个不同版本的gcc
(例如gcc-xc driver main.o modules.o
),但没有任何效果:编译器不断返回
error: called object is not a function
.o
文件是我的源代码文件(我被指示将我的源代码放在扩展名为.o
的文件中),我该如何编译此文件?您应该包括.h
文件,这些文件是“标题”。因此,如果您的主文件使用模块,那么您应该包含模块的头文件。您应该定义要从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;
返回0;
}
$
$gcc t.o
ld:警告:在t.o中,文件不是必需的体系结构
未定义的符号:
“_main”,引用自:
从crt1.10.6.o开始
ld:找不到符号
collect2:ld返回了1个退出状态
$
如果您有两个源文件,您可以将它们编译成目标文件而无需链接,如下所示:
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
的文件”,那么这种情况就更有意义了
program: main.o
gcc -o main main.c anotherSource.c
这对我很有用。具体是关于什么?将源代码直接放入
.o
文件的想法?这对我来说似乎非常奇怪,尤其是因为gcc
无法识别.o
文件,但这就是我来找你们的原因!您不能编译.o
文件,您可以链接它们。#include
:它进入.c
文件,而不是.o
文件。@StevenH.o
文件是.c
文件通常编译成的文件。如果文件包含C源代码,则不应使用扩展名.o
命名。@StevenH:这的确是一个非常奇怪的要求@dreamlax这就是为什么我要照你们说的做DYou当然不应该在C源文件中包含.o
文件,这真的很奇怪,而且gcc不会编译.o
文件,但是如果示例中有main
函数,那么命令行就可以正常工作。如果您有一个源文件,那么gcc-o main.o main.c-c
,然后gcc main.o
将链接并创建您的a.out
可执行文件。@PaulGriffiths,关键是:我在t.o文件中有main():-)。是的,我的意思是,如果您有一个定义了main()
的实际对象文件,而不是一个具有误导性扩展名的源文件,那么gcc将在该命令行中正常工作!如果我有60个源文件呢?