编译错误 /usr/bin/ld: 无法打开输出文件 bin/server: No such file or directory

Lem*_*mmy 2 c++ makefile

我正在尝试在 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
Run Code Online (Sandbox Code Playgroud)

这是一个生成文件:

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
Run Code Online (Sandbox Code Playgroud)

可能是我忘了为 linux 安装一些东西?

Chn*_*sos 6

您的问题很简单:在链接可执行文件之前,您不检查目录 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)
Run Code Online (Sandbox Code Playgroud)