如何修复C程序中未解决的引用错误[已关闭]

new9mtju  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(450)

**已关闭。**此问题为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

效果和预期的一样。
那么,有人能解释一下我的代码有什么问题,是什么让第二种方法工作的。

zphenhs4

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.outmy_program
GCC的-c创建一个对象文件(.o),它在某种程度上是.c文件的编译版本。

相关问题