我试图在OSX El Capitan上编译我的代码。这是我的Makefile
TARGET = proj_name
CC = gcc
# compiling flags
CFLAGS = -std=c99 -Wall -I.
LINKER = gcc -o
# linking flags
LFLAGS = -Wall -I. -lm
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SOURCES := $(wildcard $(SRCDIR)/*.c)
INCLUDES := $(wildcard $(SRCDIR)/*.h)
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm = rm -f
$(BINDIR)/$(TARGET): $(OBJECTS)
@$(LINKER) $@ $(LFLAGS) $(OBJECTS)
@echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
@echo "Compiled "$<" successfully!"
.PHONEY: clean
clean:
@$(rm) $(OBJECTS)
@echo "Cleanup complete!"
.PHONEY: remove
remove: clean
@$(rm) $(BINDIR)/$(TARGET)
@echo "Executable removed!"
在El Capitan上编译时,我一直收到以下错误
ld: can't open output file for writing: bin/proj, errno=2 for architecture x86_64
我理解它是一个链接器问题,但如果有人可以帮我修改Makefile,那真的会有所帮助。
答案 0 :(得分:7)
Errno 2意味着(谷歌搜索errno列表):
#define ENOENT 2 /* No such file or directory */
bin/proj
是相对路径。
查看Makefile,最可能的原因似乎是,bin
目录根本不存在。 ld
如果不存在,则不会尝试创建它。要修复,请添加
mkdir -p $(BINDIR)
之前$(LINKER)
行(-p
开关允许创建路径(如果路径不存在),在这种情况下,如果bin
已经存在,则会阻止错误。“
附注:相对路径的另一个常见原因是,当运行ld
时,工作目录不是您认为的那样。在pwd
命令之前添加$(LINKER)
之类的命令有助于对此进行故障排除。但是看看Makefile,这可能不是原因。