неопределенная проблема со ссылкой при включении заголовка

#c #ubuntu #gcc #makefile

#c #ubuntu #gcc #makefile

Вопрос:

Я создаю проект на языке Си, который предполагает создание скомпилированного файла «assembly». У меня есть эти файлы :

main.c :

 #include <stdio.h>
#include "FirstTransition.h"
#include "Constants.h"
int main() {
   return firstTransition(TEMP_FILE); 
}
 

FirstTransition.h

 #ifndef FIRSTTRANSITIONH
#define FIRSTTRANSITIONH
int firstTransition(char*);
#endif
 

FirstTransition.c

 /*This file contain the first transition method.*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Constants.h"
#include "Structs.h"
#include "UtilsFuncs.h"
int firstTransition (char *fileName)
{
    int IC=100,DC=0; /*IC - Instructions counter, DC - Data counter.*/
    FILE *insFile; /*Instructions file pointer.*/ 
    instNode *listOfInstructions;
    instNode *temp;
    if((insFile=fopen(fileName,"r"))==NULL)
    {
        perror("cannot open file!");
        return EXIT_FAILURE;
    }

    listOfInstructions = buildInstructionsList(insFile);
    temp = listOfInstructions;
    while(temp!=NULL)
    {
        printf("%s->",temp->words);
    }
    
    if (fclose(insFile))
    {
        perror("cannot close file!");
        return EXIT_FAILURE;
    }
    return(EXIT_SUCCESS);
}
 

Утилизационные функции.h

 #ifndef UTILSFUNCSH
#define UTILSFUNCSH


#include <stdio.h>
#include "Structs.h"
instNode* buildInstructionsList(FILE *);

#endif 
 

UtilsFuncs.c

 /*
This file contains all the utilites functions for the project.
*/
#include <stdlib.h>
#include <stdio.h>
#include "Structs.h"
#include "Constants.h"
#include "UtilsFuncs.h"

instNode* buildInstructionsList(FILE *insFile)
{
    char line[MAX_LINE_LEN] ={0};/*varible for reading the lines.*/
    instNode *head = NULL;
    instNode *pos = NULL;
    while (fgets(line, MAX_LINE_LEN, insFile))
    {
        if(pos == NULL) /*first insertion*/
        {
            head = (instNode*)malloc(sizeof(instNode));
            pos = head;
            head->words = line;
            head->next = NULL;
        }
        else
        {
            pos->next = (instNode*)malloc(sizeof(instNode));
            pos->next->words=line;
            pos->next->next=NULL;
            pos=pos->next;
        }
    }
    return head;
}
 

и у меня также есть этот makefile:

 myprog:main.o firstTransition.o 
    gcc -g -ansi -Wall -pedantic main.o firstTransition.o -o myprog 
main.o: main.c FirstTransition.h
    gcc -c -ansi -Wall -pedantic main.c -o main.o
firstTransition.o: FirstTransition.c Constants.h FirstTransition.h UtilsFuncs.h
    gcc -c -ansi -Wall -pedantic FirstTransition.c -o firstTransition.o
UtilsFuncs.o: UtilsFuncs.c Constants.h Structs.h UtilsFuncs.h
    gcc -c -ansi -Wall -pedantic UtilsFuncs.c -o UtilsFuncs.o
 

У меня возникает эта ошибка, когда я пытаюсь выполнить «make» в терминале:

gcc -g -ansi -Wall -педантичный main.o Первый переход.o -o myprog /usr/bin/ld: firstTransition.o: в функции firstTransition': FirstTransition.c:(.text 0x57): undefined reference to buildInstructionsList’ collect2: ошибка: ld вернул 1 статус выхода make: *** [makefile:2: myprog] Ошибка 1

В чем проблема? почему я не могу запустить этот код? Он не создает объектный файл для UtilsFuncs… Я попытался удалить защиту заголовка, но это тоже не помогло.

Спасибо.

Комментарии:

1. Вы не ссылаетесь UtilsFuncs.o на свою основную программу

2. он даже не был создан…

3. Потому что он не указан в зависимостях.

4. Спасибо! исправлено.

Ответ №1:

Вам необходимо добавить UtilsFuncs.o перед первым переводом.o при связывании вашей программы:

  gcc -g -ansi -Wall -pedantic main.o UtilsFuncs.o firstTransition.o -o myprog