编译错误 /usr/bin/ld: 无法打开输出文件 bin/server: 没有这样的文件或目录

Posted

技术标签:

【中文标题】编译错误 /usr/bin/ld: 无法打开输出文件 bin/server: 没有这样的文件或目录【英文标题】:Compiling Error /usr/bin/ld: cannot open output file bin/server: No such file or directory 【发布时间】:2014-12-14 16:58:52 【问题描述】:

我正在尝试在 ubuntu 中使用 makefile 编译我的程序 C。但我不知道它有什么问题。还有一个我无法修复的错误。

gcc -Wall -I. -pthread -ggdb -g -O0  -o bin/server server/message_queue.o server/client_thread.o server/server.o server/file.o server/datatypes.o common/datatypes.o common/error.o common/socket.o
/usr/bin/ld: cannot open output file bin/server: No such file or directory
collect2: error: ld returned 1 exit status
make: *** [bin/server] Error 1

这是一个生成文件:

CC=gcc
CFLAGS=-Wall -I. -pthread -ggdb -g -O0
SERVER_OBJ=\
 server/message_queue.o \
 server/client_thread.o \
 server/server.o \
 server/file.o \
 server/datatypes.o

COMMON_OBJ=\
 common/datatypes.o \
 common/error.o \
 common/socket.o

CLIENT_OBJ=\
 client/send_thread.o \
 client/recv_thread.o \
 client/terminal_thread.o \
 client/client.o \
 client/datatypes.o

BIN=bin

all: server client

server: $(BIN)/server
client: $(BIN)/client

$(BIN)/server: $(SERVER_OBJ) $(COMMON_OBJ)
 $(CC) $(CFLAGS) $(SERVER_CFLAGS) -o $@ $^

$(BIN)/client: $(CLIENT_OBJ) $(COMMON_OBJ)
 $(CC) $(CFLAGS) $(CLIENT_CFLAGS) -o $@ $^

%.o: %.c
 $(CC) $(CFLAGS) -c -o $@ $^

clean:
 rm -f server

可能是我忘记为 linux 安装 somthing 了吗?

【问题讨论】:

你有目录“bin”吗? 是的,但在系统文件中 什么?您的 makefile 假设在与“client”、“server”和“common”相同的父目录中有一个“bin”文件夹,基于 BIN=bin 是的!谢谢你。这有帮助。 【参考方案1】:

您的问题很简单:在链接可执行文件之前,您没有检查目录 bin 是否存在。此外,您的 makefile 有点混乱。那个应该做你想做的:

BIN         :=  bin
CLIENT      :=  $(BIN)/client
SERVER      :=  $(BIN)/server

COMMON_SRC  :=  $(wildcard common/*.c)
COMMON_OBJ  :=  $(COMMON_SRC:.c=.o)

CLIENT_SRC  :=  $(wildcard client/*.c)
CLIENT_OBJ  :=  $(CLIENT_SRC:.c=.o)

SERVER_SRC  :=  $(wildcard server/*.c)
SERVER_OBJ  :=  $(SERVER_SRC:.c=.o)

CPPFLAGS    :=  -I. -pthread
CFLAGS      :=  -Wall -ggdb -g -O0
LDFLAGS     :=  -pthread

.PHONY: all client server clean fclean

all: client server

client: $(CLIENT)
server: $(SERVER)

$(CLIENT): $(COMMON_OBJ) $(CLIENT_OBJ) | $(BIN)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(SERVER): $(COMMON_OBJ) $(SERVER_OBJ) | $(BIN)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(BIN):
    mkdir $@

clean:
    @$(RM) -rv $(BIN) $(COMMON_OBJ) $(CLIENT_OBJ) $(SERVER_OBJ)

【讨论】:

以上是关于编译错误 /usr/bin/ld: 无法打开输出文件 bin/server: 没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

无法编译第一个 opencv 程序,'/usr/bin/ld: 找不到 -lcv'

编译错误:/ usr / bin / ld:找不到-lclntsh

/usr/bin/ld: cannot find -lz

gcc 错误“/usr/bin/ld: 找不到 -lstdc++”

/usr/bin/ld:构建调试/obj/gpsitem.o:文件无法识别:文件被截断

错误-解决/usr/bin/ld: cannot find -lxxx 问题