#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