LINUX.ORG.RU

[C] Хидеры и Undefined reference.


0

1

Доброго времени господа, столкнулся со следующей проблемой. Значится - пишу header:

#ifndef PARSER_H_INCLUDED
#define PARSER_H_INCLUDED

#define MLEN 128
#define CFG_FILE "ccafe"

struct ccafe_params
{
    char port[MLEN];
    char MMSG[MLEN];
}
ccafe_params;

void init_parameters (struct ccafe_params *parms);

char* trim (char *s);

void parse_config (struct ccafe_params *parms);



#endif // PARSER_H_INCLUDED
к нему соответственно - файл .c
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#include <parser.h>

void init_parameters (struct ccafe_params *parms)
{
    strncpy (parms->item, "port", MLEN);
    strncpy (parms->item, "MMSG", MLEN);
}

char * trim (char * s)
{
    char *s1 = s, *s2 = &s[strlen (s) - 1];
    while ( (isspace (*s2)) && (s2 >= s1) )
    s2--;
  *(s2+1) = '\0';
     while ( (isspace (*s1)) && (s1 < s2) )
    s1++;
    strcpy (s, s1);
    return s;

}

void parse_config (struct ccafe_params *parms)
{
     char *s, buff[256];
  FILE *fp = fopen (CFG_FILE, "r");
  if (fp == NULL)
  {
    return;
  }
  while ((s = fgets (buff, sizeof buff, fp)) != NULL)
  {
    if (buff[0] == '\n' || buff[0] == '#')
      continue;
    char name[MLEN], value[MLEN];
    s = strtok (buff, "=");
    if (s==NULL)
      continue;
    else
      strncpy (name, s, MLEN);
    s = strtok (NULL, "=");
    if (s==NULL)
      continue;
    else
      strncpy (value, s, MLEN);
    trim (value);
    if (strcmp(name, "port")==0)
      strncpy (parms->port, value, MLEN);
    else if (strcmp(name, "MMSG")==0)
      strncpy (parms->MMSG, value, MLEN);
   // else if (strcmp(name, "size")==0)
   //   strncpy (parms->size, value, MAXLEN);
    else
      printf ("WARNING: %s/%s: Unknown name/value pair!\n",
        name, value);
  }
  fclose (fp);

}

В main.c - подключаю parser.h, и пытаюсь выполнить следующий код

struct ccafe_params parms;
    printf ("Initializing parameters to default values...\n");
    init_parameters (&parms);
    printf ("Reading config file...\n");
    parse_config (&parms);
    printf ("Final values:\n");
    printf ("  port: %s, MSG: %s\n", parms.port,parms.MMSG);
- и тут же ловлю undefined reference init_parameters и parse_config. Вопрос - как исправить, и главное - в чем ошибка?

Компиль .c с кодом и линкуй его. Ты не забыл добавить .c в проект?

unC0Rr ★★★★★ ()
Ответ на: комментарий от r2d2

да, попутал, обычно это линкер либу найти не может, ключик -l нужен

registrant ★★★★★ ()
Ответ на: комментарий от CynicRus

Для начала, научись компилировать ручками из командной строки, а потом и сам поймешь, где облажался. Впрочем, тебе тут уже раза четыре дали правильный ответ.

delete83 ★★ ()
Ответ на: комментарий от delete83
gcc -c main.c parser.c 
gcc main.o parser.o -o program 
/CCafe/socketC$ ./program 
Initializing parameters to default values... 
Reading config file... 
Final values: port: 9050, MSG: 256 

Все путем, все работает. В Code:Blocks же - все тот же undefined reference. Гугл явного ответа на впорос не дал, причем странно - ведь #include «myfile.h» - означает искать myfile.h в локальном каталоге.

CynicRus ()
Ответ на: комментарий от CynicRus

Была такая же проблема, тоже из main() не виделись функции определённые в хидере, при том что все файлы были включены в проект. Дело это я так и не победил, а просто ушёл на cmake :)

xterro ★★★★★ ()
Ответ на: комментарий от panter_dsd

Ну parser.h лежит в каталоге с проектом, не это понятно - что стандартная рекомендация писать код в vi + gcc, но у меня левел не столь высокий, дабы привыкать к управлению vi.

CynicRus ()
Ответ на: комментарий от CynicRus

Зачем в vi? пиши в emacs, он искаропки гораздо более усер-френдли, большинство стандартных клавосочетаний работают привычным образом, а включив cua-mode либо поставив ergoemacs воообще получаем «блокнот» на стероидах.

А вообще - сделай один раз нормальный Makefile и пиши в чём хочешь

lazyklimm ★★★★★ ()
Ответ на: комментарий от CynicRus

При чем тут parser.h? У тебя ругался линкер на то, что видит определение, а реализации нихрена нет.

panter_dsd ★★★★ ()
Ответ на: комментарий от lazyklimm

Пофиксил Code::Blocks, кому интересно - в файле проекта, в секции описания состава файла проекта, который должен выглядеть следующим образом:

 <Unit filename="main.c">
			<Option compilerVar="CC" />
		</Unit>
		<Unit filename="parser.c">
			<Option compilerVar="CC" />
		</Unit>
		<Unit filename="parser.h">
		</Unit> 
- после строки с <Option compiler Var> - была абсолютно левая строка, Target чего-то там. Снес её - proffit!

CynicRus ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.