【问题标题】:How to link multiple .c files如何链接多个 .c 文件
【发布时间】:2018-12-05 21:18:03
【问题描述】:

我知道您必须创建一个头文件并将其#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){
    ...
}

我的制作文件

#
# 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 

【问题讨论】:

  • 您的 makefile 与您的示例不匹配,例如C_FILES 不包括threads.c 和myCityFromInput.c。

标签: c file c99


【解决方案1】:

看起来像这样

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 文件,我们也可以提供帮助...

【讨论】:

  • @EugeneSh。看来他的makefile是先编译然后链接的。
【解决方案2】:

我猜您实际上要问的是“我的 makefile 有什么问题?”。由于您没有提供它,我只能进行有根据的猜测。这是一个 GNUmake sn-p 来构建你的程序:

.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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多