**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答复。
此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
4天前关闭。
Improve this question
我刚刚学习了C中的多文件编译,并尝试了一个测试问题,但即使在遵循所有指令后,我在编译时仍然得到相同的错误。我的程序以数组的形式获取学生对测试的响应(这是在单独的.c文件中为每个学生完成的),然后将其与主文件中声明的答案键进行匹配。我定义了一个函数answer(),它以问题编号为参数,返回学生对该问题的回答。
每个文件中的代码如下
主文件(checkanswer.c)
#include <stdio.h>
#include "answer.h"
int main()
{
int anskey[4]={5,10,0,4}, score=0;
for (int i=0;i<3;i++)
{
if (anskey[i]==answer(i+1))
{
score+=1;
}
}
printf("The score of student is %d",score);
}
student1.c
#include "answer.h"
int answer(int qno)
{
int ans[4] = {15,10,2,4};
return ans[qno-1];
}
answer.h
int answer(int qno);
为了进行多文件编译,我按照说明使用-c标志从两个.c文件生成.o文件,然后使用-o进行编译并给予可执行文件。
我在终端运行了以下程序
gcc -c checkanswer.c
gcc -c student1.c
gcc -o student1.o checkanswer.o
./a.out
这给了我一个错误,说明“未解决的引用到答案”
我也试过用
gcc checkanswer.c student1.c
效果和预期的一样。
那么,有人能解释一下我的代码有什么问题,是什么让第二种方法工作的。
1条答案
按热度按时间zphenhs41#
首先:GCC的
-o
代表“output”,它是输出文件的名称。-o file将输出放入文件file中。这适用于任何类型的输出,无论是可执行文件,目标文件,汇编文件或预处理的C代码。
如果未指定-o,则默认情况下将可执行文件放在.out中,将source.suffix的目标文件放在source.o中,将其汇编程序文件放在source.s中,将预编译的头文件放在source.suffix.gch中,并将所有预处理的C源代码放在标准输出中。
您应该通过运行
gcc -o NAME student1.o checkanswer.o
来消除此错误(您可以将NAME
替换为a.out
或my_program
)GCC的
-c
创建一个对象文件(.o),它在某种程度上是.c文件的编译版本。