ld:无法打开输出文件进行写入:bin / s,errno = 2 for architecture x86_64

时间:2015-10-07 04:55:03

标签: c macos gcc

我试图在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,那真的会有所帮助。

1 个答案:

答案 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,这可能不是原因。