Ошибка C: не удалось выполнить команду компоновщика с кодом выхода 1 (используйте-v, чтобы увидеть вызов)

#c #compiler-errors #command #main #exit-code

Вопрос:

Я новичок в 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",amp;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", amp; *N[i]);

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

    printf("Informe o preço do produto: n");
    scanf("%f", amp;compra.preco);
    soma2 = soma2   compra.preco;
    printf("nDeseja mais algum produto? n4-Sim n0-Não, sair n -->  ");
    scanf("%d",amp;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. Добро пожаловать в SO. Пожалуйста, начните читать свое сообщение об ошибке сверху: undefined reference to 'N'

2. Где это N определено? Вы объявляете это как external , но не добавляете никаких других единиц компиляции, кроме main.c

3. Раньше ошибка в «N» была warning: tentative array definition assumed to have one element , и единственным способом исправить то, что они мне объяснили, было объявить ее внешней, что порождает всю проблему. Хотя до этого проблема с двумя другими именами уже существовала.

4. Я голосую за то, чтобы закрыть этот вопрос, потому что это не поможет решить ваши конкретные ошибки. Пожалуйста, ознакомьтесь с общим руководством по программированию на языке Си, прежде чем приступать к написанию кода, и узнайте, как работают компиляторы, компоновщики и операторы включения.

Ответ №1:

Несколько проблем:

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

Вы объявляете N как extern без инициализации, поэтому вам также потребуется удалить его в другом модуле с инициализацией. Но на самом деле вы никогда не используете переменную N . У вас есть N[][40] в качестве аргумента, чтобы Digitanome . Как только вы исправите пункты 2 и 3 ниже, вы сможете extern char (N[][40]); полностью удалить их.

  1. Вы определяете Digitanome и Lista внутри main() . Вам нужно определить их вне main() .
  2. У вас есть точки с запятой в конце Digitanome Lista определений функций и функций. Вам нужно их удалить.
  3. У вас есть код, следующий за return 0 заявлением.
  4. Ты звонишь Digitanome изнутри Digitanome . Вероятно, это не то, чего вы хотите.

Как только вы устраните эти проблемы, вы, вероятно, найдете больше.