Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用gcc编译多个C文件_C_Gcc - Fatal编程技术网

用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个源文件呢?