代pf 2024-03-28 10:51 采纳率: 14.3%
浏览 8

问题出在哪里了,怎么解决

报错

ld: Undefined symbols:
  _GuessNumber, referenced from:
      _main in main-54809c.o
  _MakeNumber, referenced from:
      _main in main-54809c.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)

代码如下

//main.c

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "guess.h"

int main(void)
{
    int number;
    char reply;
    srand(time(NULL));
    do
    {
        number=MakeNumber();
        GuessNumber(number);
        printf("Do you want continue(Y/N or y/n)?");
        scanf(" %c",&reply);
    }while(reply=='Y'||reply=='y');
    return 0;
}
//guess.h

void GuessNumber(int number);
int IsRight(int number,int guess);
int IsValidNum(int number);
int MakeNumber(void);

//GuessNumber.c

#include <stdio.h>
#include "IsRight.h"
#include "IsValidNum.h"

void GuessNumber(int number)
{
    int guess,ret;
    int count=0;
    int right=0;
    do
    {
        printf("Try%d:",count+1);
        ret=scanf("%d",&guess);
        while(ret!=1||IsValidNum(guess))
        {
            printf("Input error? \n");
            while(getchar()!='\n');
            printf("Try%d:",count+1);
            ret=scanf("%d",&guess);
        }
        count++;
        right=IsRight(number,guess);
    } while (!right&&count<MAX_TIMES);
    if(right)
    {
        printf("Congratulation!You're so cool!\n");
    }
    else
    {
        printf("Mission failed after %d attemps.\n",MAX_TIMES);
    }

    
}

//GuessNumber.h

void GuessNumber(int number);


//MakeNumber.c

#include <stdio.h>
#include <assert.h>
#include "MakeNumber.h"

int MakeNumber(void)
{
    int number;
    number=(rand()%(MAX_NUMBER-MIN_NUMBER+1)+MIN_NUMBER);
    assert(number>=MIN_NUMBER&&number<=MAX_NUMBER);
    return number;
}

//MakeNumber.h

#define MAX_NUMBER 100
#define MIN_NUMBER 1
int MakeNumber(void);

//IsValidNum.c

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

int IsValidNum(int number)
{
    if(number>=MIN_NUMBER&&number<=MAX_NUMBER)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}


//IsValidNum.h

#define MAX_NUMBER 100
#define MIN_NUMBER 1
int IsValidNum(int number);


//IsRight.c

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

int IsRight(int number,int guess)
{
    if(guess<number)
    {
        printf("Wrong!Too small!\n");
        return 0;
    }
    else if(guess>number)
    {
        printf("Wrong!Too big!\n");
        return 0;
    }
    else return 1;
}


//IsRight.h

#define MAX_TIMES 10
int IsRight(int number,int guess);


//guess.h

void GuessNumber(int number);
int IsRight(int number,int guess);
int IsValidNum(int number);
int MakeNumber(void);

  • 写回答

3条回答 默认 最新

  • 鑫宝Code 优质创作者: 编程框架技术领域 2024-07-04 08:01
    关注
    此回答引用GPT4,由博主鑫宝Code参考后得出

    从您提供的错误信息来看,编译器在链接阶段遇到了问题,因为找不到 _GuessNumber_MakeNumber 这两个符号。这通常意味着编译器在编译过程中没有找到这些函数的定义,或者这些函数的定义没有被正确地编译和链接。

    首先,让我们检查一下代码结构和问题可能的原因:

    1. 头文件包含问题:在 GuessNumber.c 中,您包含了 "IsRight.h""IsValidNum.h",但是没有包含 "MakeNumber.h",这可能是导致 _MakeNumber 未定义的原因之一。您需要确保所有需要的头文件都被正确包含。

    2. 函数声明和定义不匹配:检查所有函数的声明和定义是否一致。例如,MakeNumber 函数在 MakeNumber.h 中声明为 int MakeNumber(void);,但在 MakeNumber.c 中没有定义。这可能是导致 _MakeNumber 未定义的原因。

    3. 编译顺序问题:如果编译器先编译了 main.c,然后是 GuessNumber.c 和其他文件,它可能在 main.c 中找不到 GuessNumberMakeNumber 的定义。确保所有相关的源文件都被编译。

    4. 链接问题:确保所有编译生成的 .o 文件都被链接在一起。如果使用 gccclang,确保在命令行中包含了所有源文件。

    5. 缺少定义的常量MAX_TIMESIsRight.h 中被使用,但没有在任何头文件或源文件中定义。您需要在适当的地方定义这个常量。

    6. 文件命名和包含路径问题:确保所有文件的命名和包含路径是正确的。例如,#include "IsRight.h" 应该对应于实际的文件名 IsRight.h

    根据上述问题,这里是一些可能的解决方案:

    • 确保所有源文件和头文件的命名是正确的,并且它们都位于编译器可以找到的路径中。
    • 确保所有函数都有相应的声明和定义,并且它们在编译时是可见的。
    • 确保所有需要的头文件都被包含在相应的源文件中。
    • 如果您使用的是 Makefile 或其他构建系统,请确保所有相关的源文件都被包含在编译和链接过程中。
    • 定义所有在代码中使用的常量,例如 MAX_TIMES

    最后,您可以使用以下命令来编译和链接您的程序(假设所有源文件都在同一个目录中):

    clang -o myprogram main.c GuessNumber.c MakeNumber.c IsValidNum.c IsRight.c
    

    这将编译所有源文件并将它们链接到一个名为 myprogram 的可执行文件中。如果问题仍然存在,请检查每个步骤以确保所有问题都得到解决。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月28日