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

How to fix unresolved reference error in my C program [closed]

提问人:ErrorEliminator 提问时间:5/31/2023 更新时间:5/31/2023 访问量:57

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

6个月前关闭。

我刚刚学习了 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];
}

答案.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

它按预期工作。

因此,有人可以阐明我的代码出了什么问题以及是什么使第二种方法起作用。

c gcc 链接器错误

评论

1赞 Tom Karzes 5/31/2023
此命令是错误的:它告诉将可执行文件放在 .将其更改为 这将生成一个名为 的可执行文件。请务必先重新编译,因为您之前的尝试可能已经破坏了它。gcc -o student1.o checkanswer.ogccstudent1.ogcc -o myprog student1.o checkanswer.omyprogstudent1
1赞 Tom Karzes 5/31/2023
投票关闭为错别字。
0赞 ErrorEliminator 5/31/2023
gcc 默认不会创建一个名为 a.out 的可执行文件,那为什么我必须单独给出一个可执行文件名称
0赞 Aconcagua 5/31/2023
因为这是选项所需要的......如果您想依赖默认名称,则根本不提供。-o-o
1赞 Tom Karzes 5/31/2023
因为你告诉它.如果您愿意,请执行此操作: 这将生成默认文件。选项告诉它下一个参数是输出文件的名称。RTFM。-ogcc student1.o checkanswer.oa.out-o

答:

1赞 Paul-Marie 5/31/2023 #1

第一:GCC 代表“output”,它是输出文件的名称 从:-oman gcc

-o 文件 将输出放在文件文件中。无论生成哪种类型的输出,无论是可执行文件、目标文件、汇编文件还是预处理的 C 代码,这都适用。

如果未指定 -o,则默认将可执行文件放在 a.out 中,将 source.suffix 的目标文件放在 source.o 中,将其汇编器文件放在 source.s 中,将预编译的头文件放在 source.suffix.gch 中,并将所有预处理的 C 源代码放在标准输出上。

您应该通过 runninh 来消除此错误(您可以替换为 或gcc -o NAME student1.o checkanswer.oNAMEa.outmy_program)

GCC 创建一个目标文件 (.o),它在某种程度上是 .c 文件的编译版本。-c

评论

0赞 Tom Karzes 6/1/2023
如果需要默认值,则完全省略的正常方法。a.out-o NAME
0赞 Paul-Marie 6/1/2023
@TomKarzes是的,但这是为了解释这个标志在做什么,以及有什么比以默认值为例来显示这个标志改变了哪个值更好的方法?:)