我正在尝试使用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文件链接到不同的文件夹中。
谢谢!
答案 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,它编译和构建一个存档库,然后在该目录中链接该存档库。