C error: linker command failed with exit code 1 (use -v to see invocation)

C error: linker command failed with exit code 1 (use -v to see invocation)

我是 C 的新手,我已经搜索过但没有找到答案,但我一直在尝试让程序给我一个列表,其中包含由用户后跟所有价格的总和,我发现错误:

clang-7 -pthread -lm -o main main.c
/tmp/main-7440c0.o: In function `main':
main.c:(.text+0x12b): undefined reference to 'N'
main.c:(.text+0x164): undefined reference to 'Digitanome'
main.c:(.text+0x17f): undefined reference to 'Lista'
clang-7: error: linker command failed with exit code 1 (use -v to see invocation)
exit status 1

我一直在尝试的代码是这个:

#include <stdio.h>
#include<stdlib.h>
#include <string.h>

extern char (N[][40]);
int i;
char p;
int cod,cont, soma2;
char soma[100];

int Digitanome( char [][40], int );
void Lista( char [100][40], int );

typedef struct {
char produto[30];
char seçao [30];
float preco;
int cargo;
}Supermercado;

Supermercado compra;

    
int main(void)
{
  char Nome[100][40] = { '[=11=]' };
  int qtdNomes = 0;

  soma2 = 0;
  do{  
    printf("\n\nEm qual seção está seu produto?");
    printf("\n1-Frutas \n2-Doces \n3-Material de Limpeza\n -->  ");
    scanf("%d",&cod);
    if(cod == 1){
      *compra.seçao = *strcpy(compra.seçao,"Frutas");
    }
    if(cod == 2){
      *compra.seçao = *strcpy(compra.seçao, "Doces");
    }
    if(cod == 3){
      *compra.seçao = *strcpy(compra.seçao,"Material de Limpeza");
    }
    int Digitanome(char N[][40], int i);
    {
      printf("Informe o produto que você quer nesta seção: \n");
      scanf("%s", & *N[i]);

      *compra.produto = Digitanome( Nome, qtdNomes );
      Lista( Nome, qtdNomes );
      return ++i;
    }
    return 0; 

    printf("Informe o preço do produto: \n");
    scanf("%f", &compra.preco);
    soma2 = soma2 + compra.preco;
    printf("\nDeseja mais algum produto? \n4-Sim \n0-Não, sair \n -->  ");
    scanf("%d",&cont);
  }while(cont == 4);
  {
    if (cont == 0)
      printf("\nFIM DAS COMPRAS!\n");

    void Lista(char p[100][40], int i);{
      int j = 0;
      for (; j < i; j++ )
        printf("\nSeus produtos são:%s\n", compra.produto);
    }
    printf("Essa compra está custando: %i \n", soma2);
  }
}

任何人都可以向我解释发生了什么以及如何解决它吗?

几个问题:

  1. extern char (N[][40]);

您在没有初始化的情况下将 N 声明为 extern,因此您还需要在另一个带有初始化的模块中对其进行 delcare。但实际上您从未使用过变量 N。您将 N[][40] 作为 Digitanome 的参数。修复下面的第 2 项和第 3 项后,您可以完全删除 extern char (N[][40]);

  1. 你在main()里面定义了DigitanomeLista。您需要在 main().

    之外定义它们
  2. 您在 DigitanomeLista 函数定义的末尾有分号。你需要删除那些。

  3. 您在 return 0 语句之后有代码。

  4. 您从 Digitanome 内部调用 Digitanome。这可能不是你想要的。

解决这些问题后,您可能会发现更多问题。

正如 Jim 所提到的,您的代码中存在一些语法错误,您需要修复。

我无法理解你的代码逻辑,所以如果你仍然需要帮助,请给我评论,以便我们一起完成!

#include <stdio.h>
#include<stdlib.h>
#include <string.h>

extern char (N[][40]); int i; char p; int cod,cont, soma2; char soma[100];

int Digitanome( char [][40], int ); void Lista( char [100][40], int ); int qtdNomes = 0;

char Nome[100][40] = { '[=10=]' };

typedef struct { char produto[30]; char seçao [30]; float preco; int cargo; }Supermercado;

Supermercado compra;

     int main(void) {

  soma2 = 0;   do{  
    printf("\n\nEm qual seção está seu produto?");
    printf("\n1-Frutas \n2-Doces \n3-Material de Limpeza\n -->  ");
    scanf("%d",&cod);
    if(cod == 1){
      *compra.seçao = *strcpy(compra.seçao,"Frutas");
    }
    if(cod == 2){
      *compra.seçao = *strcpy(compra.seçao, "Doces");
    }
    if(cod == 3){
      *compra.seçao = *strcpy(compra.seçao,"Material de Limpeza");
    }
    
    return 0; 

    printf("Informe o preço do produto: \n");
    scanf("%f", &compra.preco);
    soma2 = soma2 + compra.preco;
    printf("\nDeseja mais algum produto? \n4-Sim \n0-Não, sair \n -->  ");
    scanf("%d",&cont);   }while(cont == 4);   {
    if (cont == 0)
      printf("\nFIM DAS COMPRAS!\n");


    printf("Essa compra está custando: %i \n", soma2);   } }

int Digitanome(char N[][40], int i)
    {
      printf("Informe o produto que você quer nesta seção: \n");
      scanf("%s", & *N[i]);

      *compra.produto = Digitanome( Nome, qtdNomes );
      Lista( Nome, qtdNomes );
      return ++i;
    }

void Lista(char p[100][40], int i) {   int j = 0;   for (; j < i; j++ )
    printf("\nSeus produtos são:%s\n", compra.produto); }