C 为什么我得到了;叮当声:错误:在生成多个输出文件时无法指定-o;?

C 为什么我得到了;叮当声:错误:在生成多个输出文件时无法指定-o;?,c,gcc,compiler-errors,compilation,C,Gcc,Compiler Errors,Compilation,我是C语言的新手。我有两个简单的源代码文件f1.C和f2.C #include <stdio.h> #include "f.h" void f2(void) { f1(); } f1.c看起来像: #include <stdio.h> #include "f.h" void f1(void) { // some code ... } f1.c和f2.c共享同一标题f.h void f1(void); void f2(void); 没有main()

我是C语言的新手。我有两个简单的源代码文件
f1.C
f2.C

#include <stdio.h>
#include "f.h"

void f2(void) {
    f1();
}
f1.c
看起来像:

#include <stdio.h>
#include "f.h"

void f1(void) {
    // some code ...
}
f1.c
f2.c
共享同一标题
f.h

void f1(void);
void f2(void);
没有
main()
访问,我只想将这两个文件编译成一个
.o
文件,而不使用链接器(使用-c选项)

然后我就,

clang: error: cannot specify -o when generating multiple output files
但是当我只提到f2.c时,它工作得很好

gcc -c f2.c -o f2.o

那有什么问题?谢谢

您应该研究C的编译过程。第一阶段是将
.C
源代码编译成
.o
目标文件。
.c
文件不需要查看其他
.c
文件;他们接受你告诉他们的关于外部函数存在的事实。直到链接器出现,它才真正需要查看函数,因为实现细节对
.c
文件并不重要,只是接口,您可能已经在标题中给出了接口

如果愿意,您可以做的是删除指定要创建的输出文件的
-o
标志。只需使用
gcc-cf1.cf2.c
它将知道如何创建
f1.o
f2.o
,当您确实希望完成链接过程时,它们将能够相互链接


然而,我很好奇,你想要在没有链接的情况下编译这些文件的意图是什么。我只是在你把自己称为新手时问你,所以我想知道你是否有一个最终目标,也许你问的问题不对。

每个
.o
只能有一个
.c
文件如果没有
-c
,则
-o
标志会告诉它最后的可执行文件放在哪里,把一切联系在一起之后。对于
-c
-o
表示将
.o
文件放在与
.c
文件一起的位置。但是如果你说的是
-c
,你说的是
-o
,你指定了两个
.c
文件,
-o
与哪个
.c
文件搭配?Thx@SteveSummit!因此,如果我使用命令
gcc-cf2.c-of2.o
只编译
f2.c
,编译器将自动找到
f.h
标题中提到的函数
f1()
?请看一看。@wei如果你不想链接,那么是的,拥有
\include“f.h”
f2.c
中的
行为编译器提供了将
f2.c
编译成
f2.o
所需的所有信息。但是,稍后,当您进行链接时,您必须告诉它在哪里可以找到函数
f()
的编译代码,它可能位于单独编译的
f1.o
中。但你也需要更多地思考“链接”的含义,因为如果你不链接,你就不会像你说的那样“将这两个文件编译成
.o
文件”;你大概要把这两个文件编译成两个
.o
文件。谢谢你的回答@ChristianGibbons!因为我有很多模块,例如
a.c
b.c
,…,
z.c
。其中一些文件可以组合为一个
.exe
可执行文件。我更喜欢将每个
.c
文件编译成
.o
文件一次,然后重用对象文件。我倾向于找到一个最佳实践来编译我的c项目。正如您所提到的,gcc-cf1.cf2.c是一个很好的。好的,看起来您真正想要的是一个构建系统。每当我把一个小项目放在一起时,我通常会创建一个
Makefile
,但我想您使用的是Windows,而不是Unix衍生产品。我对Windows上的选项不太熟悉,但可以尝试从
nmake
开始,因为这似乎是他们的
make
版本。像这样的构建系统能够避免重新编译已经是最新更改的源文件,因此即使您对项目进行了更改,它也会知道只重新编译受更改影响的部分。很好的提示。在使用
Makefile
:>
gcc -c f2.c -o f2.o