Ошибка "Неопределенный символ <function>, на который впервые ссылается файл <file>" - PullRequest
3 голосов
/ 18 февраля 2011

Я пишу свою первую программу на C для класса; Мне удалось выровнять большинство синтаксических ошибок, но я получаю странную ошибку, когда gcc пытается связать объектные файлы вместе. Он печатается так же, как показано ниже:

gcc -o proj04.support.o proj04.driver.o
Undefined                       first referenced
 symbol                             in file
convert                             proj04.driver.o

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

Makefile (опубликовать это первым, потому что я подозреваю, что проблема здесь)

# Comments
# Comments

proj04: proj04.support.o proj04.driver.o
        gcc -o proj04.support.o proj04.driver.o

proj04.support.o: proj04.support.c
        gcc -Wall -c proj04.support.c

proj04.driver.o: proj04.driver.c
        gcc -Wall -c proj04.driver.c

Заголовочный файл (предоставлен профессором, без изменений, одна строка):

int convert( int, unsigned, char[], int )

Файл реализации

#include <stdio.h>
#include "/user/cse320/Projects/project04.support.h"
#include <string.h>

void formatdisplay( char[], int );

int convert( int I, unsigned base, char result[], int display )
{
  int quotient, dividend, remainder;
  const int divisor = base;
  int count = 0;
  char ending[] = " base ";

  dividend = I;
  remainder = 0;
  quotient = 1;

  while (quotient != 0)
  {
    if (count <= strlen(result))
    {
      quotient = (dividend / divisor);
      remainder = (dividend % divisor);
      //convert to ascii char
      result[count] = remainder;
      count++;
    }
  }

  formatdisplay ( result, display );

  strrev(result);

  if ( I >= 0 ) { result[0] = '+'; }
  if ( I < 0 ) { result[0] = '-'; }

  printf( "%s" , strcat (result, ending));

}     

void formatdisplay ( char str[], int disp )
{     
  if ( disp < 0 )
  {
    unsigned i = 0;
    for ( i; i < strlen(str)-1; i++)
    {
      if ( str[i] = '\0') { str[i] = '0'; }
    }
  }
  if ( disp >= 0 )
  { 
    unsigned i = 0;
    for ( i; i < strlen(str)-1; i++)
    { 
      if ( str[i] = '\0') { str[i] = ' '; }
    }
  }   
} 

Файл драйвера (еще не реализован)

#include <stdio.h>
#include "/user/cse320/Projects/project04.support.h"

int main () {
  char Result1[32];
  int T = convert(10, 2, Result1, 1);
}

Ответы [ 3 ]

3 голосов
/ 20 октября 2011

У меня была почти такая же проблема.

Undefined first referenced symbol in file isThreeOfAKind /var/tmp//ccIQWbaj.o

Моя проблема заключалась в том, что я пропустил букву в одной из своих функций, поэтому объявление и функция сместились.Пример:

 void isThreeOfAKind (void);
 void isThreeOfAkind {}

Пропустил верхний регистр K и написал вместо него строчный k.

После того как я изменил k на верхний регистр K, он скомпилировался нормально.если это поможет, но это может быть что-то столь же простое.

3 голосов
/ 21 октября 2011

Я не эксперт, но, как сказал выше Андреас Йоэнссон (который, судя по названию функции, пишет ту же самую программу, что и я), эта проблема возникает, когда есть некоторое несоответствие между объявлением и использованием функции.

Ваша функция convert объявлена ​​как возвращающая int, но я не вижу возвращаемого значения. Это может быть проблемой.

3 голосов
/ 18 февраля 2011

Да, проблема, вероятно, в файле Makefile:

proj04: proj04.support.o proj04.driver.o
        gcc -o proj04.support.o proj04.driver.o

Параметр -o для gcc принимает аргумент, имя выходного файла.Так что это просит gcc связать файл proj04.driver.o, создавая выходной файл proj04.support.o.

gcc -o proj04 proj04.support.o proj04.driver.o должно работать лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...