Как связать несколько файлов .c - PullRequest
0 голосов
/ 06 декабря 2018

Я знаю, что вы должны создать заголовочный файл и #include его в своей основной.Я сделал это, и когда я по какой-то причине компилирую свой код, он не может определить, где находится одна из моих функций.

Макет моего проекта: threads.c makeCityFromInput.h и makeCityFromInput.c

У меня есть threads.c #, включая makeCityFromInput.h

Вот что происходит, когда я пытаюсь скомпилировать:

make
gcc -ggdb -std=c99 -Wall -Wextra -pthread  -c threads.c
gcc -ggdb -std=c99 -Wall -Wextra -pthread -o threads threads.o  -lm -lncursesw -pthread
threads.o: In function `main':
/home/project3/threads.c:183: undefined reference to `readConfig'
collect2: error: ld returned 1 exit status
Makefile:71: recipe for target 'threads' failed
make: *** [threads] Error 1

Не удается найти мой readconfigфайл, даже если он находится в моем заголовочном файле

мой файл threads.c

#define _DEFAULT_SOURCE

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <strings.h>
#include <string.h>
#include <ncurses.h>  //displays the cars
#include <pthread.h>  //threading
#include <unistd.h>

#include "makeCityFromInput.h"

#define MAX 2048
int main(int argc, char *argv[]){
    //Expected input: Name of config file

    // If the config file is not given; or too many config files are given
    if (argc != 2){
        endwin();
        fprintf(stderr, "Usage: Enter a configuration file");
        exit( EXIT_FAILURE );
    }

    FILE *fp = NULL;
    fp = fopen(argv[1], "r");
    assert( fp );
    readConfig(fp);
    fclose( fp );

    return 0;
}

мой файл makeCityFromInput.h:

#ifndef _MAKECITYFROMINPUT_H
#define _MAKECITYFROMINPUT_H

void readConfig(FILE *fp);

int *parse_line(char *line, int *numInts);

void create_skyline(int *ground, int size, int maxMissiles);



#endif

мой файл makeCityFromInput.c:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <strings.h>
#include <string.h>
#include <ncurses.h>  //displays the cars
#include <pthread.h>  //threading
#include <unistd.h>
void readConfig(FILE *fp){
    ...
}

My make file

#
# Created by gmakemake (Ubuntu Jul 25 2014) on Wed Nov 14 20:05:05 2018
#

#
# Definitions
#

.SUFFIXES:
.SUFFIXES:  .a .o .c .C .cpp .s .S
.c.o:
        $(COMPILE.c) $<
.C.o:
        $(COMPILE.cc) $<
.cpp.o:
        $(COMPILE.cc) $<
.S.s:
        $(CPP) -o $*.s $<
.s.o:
        $(COMPILE.cc) $<
.c.a:
        $(COMPILE.c) -o $% $<
        $(AR) $(ARFLAGS) $@ $%
        $(RM) $%
.C.a:
        $(COMPILE.cc) -o $% $<
        $(AR) $(ARFLAGS) $@ $%
        $(RM) $%
.cpp.a:
        $(COMPILE.cc) -o $% $<
        $(AR) $(ARFLAGS) $@ $%
        $(RM) $%

CC =        gcc
CXX =       g++

RM = rm -f
AR = ar
LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS)
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) -c
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
CPP = $(CPP) $(CPPFLAGS)
########## Flags from header.mak


CFLAGS =        -ggdb -Wall -Wextra -pedantic -std=c99 -pthread
# program uses pthreads and curses libraries
CLIBFLAGS =     -lncursesw -lpthread -lrt


########## End of flags from header.mak


CPP_FILES = 
C_FILES =   pt-cruisers.c racer.c
PS_FILES =  
S_FILES =   
H_FILES =   racer.h
SOURCEFILES =   $(H_FILES) $(CPP_FILES) $(C_FILES) $(S_FILES)
.PRECIOUS:  $(SOURCEFILES)
OBJFILES =  racer.o 

#
# Main targets
#

all:    pt-cruisers 

pt-cruisers:    pt-cruisers.o $(OBJFILES)
    $(CC) $(CFLAGS) -o pt-cruisers pt-cruisers.o $(OBJFILES) $(CLIBFLAGS)

#
# Dependencies
#

pt-cruisers.o:  racer.h
racer.o:    racer.h

#
# Housekeeping
#

Archive:    archive.tgz

archive.tgz:    $(SOURCEFILES) Makefile
    tar cf - $(SOURCEFILES) Makefile | gzip > archive.tgz

clean:
    -/bin/rm -f $(OBJFILES) pt-cruisers.o core

realclean:        clean
    -/bin/rm -f pt-cruisers 

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Я думаю, что вы на самом деле спрашиваете: «Что не так с моим make-файлом?».Поскольку вы не предоставили это, я могу только сделать обоснованное предположение.Вот фрагмент кода GNUmake для сборки вашей программы:

.PHONY: default
default: threads

CC      := ...
LD      := ...

CFLAGS  := ...
LDFLAGS := ...
LIBS    := ...

SRCS    := threads.c makeCityFromInput.c
OBJS    := $(SRCS:%.c=%.o)

$(OBJS): %.o: %.c
        $(CC) $(CFLAGS) -o $@ -c $<

threads: $(OBJS)
        $(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
0 голосов
/ 06 декабря 2018

Возможно, моя идея неверна, но я не могу найти

#include "makeCityFromInput.h"

в вашем "makeCityFromInput.c".

Есть ли у вас файл "makeCityFromInput.h", включенный в "makeCityFromInput.c "?

0 голосов
/ 06 декабря 2018

Похоже, что это

gcc -ggdb -std=c99 -Wall -Wextra -pthread  -c threads.c
gcc -ggdb -std=c99 -Wall -Wextra -pthread  -c makeCityFromInput.c
gcc -ggdb -std=c99 -Wall -Wextra -pthread -o threads threads.o makeCityFromInput.o -lm -lncursesw -pthread

Если вы покажете свой файл make, мы также можем помочь с этим ...

...