C错误:链接器命令失败,退出代码为1(使用-v查看调用)



我是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] = { '' };
int qtdNomes = 0;
soma2 = 0;
do{  
printf("nnEm qual seção está seu produto?");
printf("n1-Frutas n2-Doces n3-Material de Limpezan -->  ");
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:%sn", compra.produto);
}
printf("Essa compra está custando: %i n", soma2);
}
}
谁能给我解释一下发生了什么事,怎么解决它?

几个问题:

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

您在没有初始化的情况下将N声明为extern,因此您还需要在具有初始化的另一个模块中声明它。但是你实际上从来不用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] = { '' };
typedef struct { char produto[30]; char seçao [30]; float preco; int cargo; }Supermercado;
Supermercado compra;
int main(void) {
soma2 = 0;   do{  
printf("nnEm qual seção está seu produto?");
printf("n1-Frutas n2-Doces n3-Material de Limpezan -->  ");
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:%sn", compra.produto); }

最新更新