使用makefile链接来自不同目录的.h文件和.c文件

时间:2016-04-03 03:20:56

标签: c++ c makefile linker

我正在尝试使用um.c从当前文件夹编译一个名为um的程序 并包括一些外部实现。 .h文件位于一个目录中,但实现这些.h文件的.c文件位于不同的目录中。下面是我的makefile。似乎编译器知道在哪里查找.h文件。但是,链接器失败并产生错误:

ld: symbol(s) not found for architecture x86_64
clang: fatal error: linker command failed with exit code 1

生成文件:

# define the C compiler to use
CC = gcc

# define any compile-time flags
CFLAGS = -g -O -Wall -Wextra -Werror -Wfatal-errors -std=c99 -pedantic

# define any directories containing header files other than /usr/include
INCLUDES = -I/Users/nguyenmanhduc/Documents/C\ library/cii/include

# define library paths in addition to /usr/lib
LFLAGS = -L/Users/nguyenmanhduc/Documents/C\ library/cii/src

# define any libraries to link into executable:
LIBS = -lm

# define the C source files
SRCS = um.c

# define the C object files 
OBJS = $(SRCS:.c=.o)

# define the executable file 
MAIN = um

.PHONY: depend clean

all:    $(MAIN)
    @echo  Simple compiler named um has been compiled

$(MAIN): $(OBJS) 
    $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)

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

clean:
    $(RM) *.o *~ $(MAIN)

depend: $(SRCS)
    makedepend $(INCLUDES) $^

这个问题可能看起来很奇怪,因为我对makefile没什么经验,但有一种方法可以使用makefile将.h和.c文件链接到不同的文件夹中。

谢谢!

2 个答案:

答案 0 :(得分:1)

这里的问题不在于您的其他.c文件位于不同的目录中:您没有告诉您的Makefile它们是否存在

在这里列出源输入(我猜你没看到评论?):

# define the C source files
SRCS = um.c

添加其他.c个文件,其中已编译的.o是您想要链接的文件。

例如:

# define the C source files
SRCS = um.c ../wot.c ../hah/lol.c

没有严格的规则,但是,你构建这个Makefile的方式,这些相对路径应该解决得很好。

答案 1 :(得分:0)

您没有链接.c个文件,而是链接.o个文件。

您似乎在说明您的某些.c文件位于不同的目录中。

无论如何,您必须在makefile中明确列出这些.c文件,就像您在目录中列出带有makefile的.c文件一样。您必须在另一个目录中编译.c文件,然后链接它们,就像编译和链接与makefile在同一目录中的.c文件一样。他们不打算自己编译。

另一种方法是在另一个目录中有一个单独的makefile,它编译和构建一个存档库,然后在该目录中链接该存档库。