【发布时间】:2017-09-18 21:56:12
【问题描述】:
我是 C 的新手。我有两个简单的源代码文件 f1.c 和 f2.c。
f1.c 看起来像:
#include <stdio.h>
#include "f.h"
void f1(void) {
// some code ...
}
f2.c 中的函数f2() 依赖于f1.c 中的f1()。
#include <stdio.h>
#include "f.h"
void f2(void) {
f1();
}
f1.c 和f2.c 共享同一个标头f.h,
void f1(void);
void f2(void);
没有main()的访问权限,我只想把这两个文件编译成一个没有链接器的.o文件(使用-c选项),
gcc -c f1.c f2.c -o f2.o
然后我得到了,
clang: error: cannot specify -o when generating multiple output files
但是当我只提到f2.c时,它运作良好,
gcc -c f2.c -o f2.o
那么问题是什么?谢谢!
【问题讨论】:
-
每个
.o文件只能有一个.c文件 -
如果没有
-c,-o标志会告诉它在将所有内容链接在一起后将最终可执行文件放在哪里。对于-c,-o表示将.o文件与.c文件放在哪里。但是如果你说-c,和你说-o,和你指定了两个.c文件,.c文件与-o一起使用? -
谢谢@SteveSummit!所以如果我只用命令
gcc -c f2.c -o f2.o编译f2.c,编译器会自动找到f.h头文件中提到的函数f1()? -
@wei 如果您不想链接,那么是的,在
f2.c中添加#include "f.h"行为编译器 提供了编译@ 所需的所有信息987654360@ 转为f2.o。但是,稍后,当您进行链接时,您将 必须告诉它在哪里可以找到函数f()的编译代码,这可能在单独编译的f1.o中。但是您还需要更多地考虑“链接”的含义,因为如果您不进行链接,那么您不会将“将这两个文件编译为.o文件”,正如您所说;您大概要将这两个文件编译成 two.o文件。
标签: c gcc compiler-errors compilation