【发布时间】:2021-12-31 13:08:58
【问题描述】:
当我尝试做时,我得到了这个错误:
gcc -Wall -Werror -Wextra ./libft/libft.a -I./libft/ -I./includes/ -o server
Undefined symbols for architecture arm64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [server] Error 1
但是我的 server.c 有 main 功能。
我的项目的目标是制作小型服务器客户端程序。所以我尝试一次制作两个目标服务器和客户端。我试图找到错误但失败了。我该如何解决?
这是我的 Makefile :
CLIENT = client
SERVER = server
CC = gcc
FLAGS = -Wall -Werror -Wextra
INC = -I$(LIBFT_DIR) -I$(HEADER_DIR)
LIBFT = $(LIBFT_DIR)libft.a
LIBFT_DIR = ./libft/
HEADER_DIR = ./includes/
HEADER_LIST = minitalk.h
HEADERS = $(addprefix $(HEADER_DIR), $(HEADER_LIST))
SRC_DIR = ./srcs/
SRC_S = server.c \
OBJ_S = $(OBJ_S:.c=.o)
SRC_C = client.c \
OBJ_C = $(OBJ_C:.c=.o)
all : $(SERVER) $(CLIENT)
$(SERVER) : $(LIBFT) $(OBJ_S)
$(CC) $(FLAGS) $^ -o $@
$(CLIENT) :$(LIBFT) $(OBJ_C)
$(CC) $(FLAGS) $^ -o $@
%.o : %.c $(HEADER_LIST)
$(CC) $(CFLAGS) -c $(INC) $< -o $@
$(LIBFT):
@$(MAKE) -C $(LIBFT_DIR) all
clean :
@$(MAKE) -C $(LIBFT_DIR) clean
@rm $(OBJ_S) $(OBJ_C)
fclean :
@$(MAKE) -C $(LIBFT_DIR) fclean
@rm $(OBJ_S) $(OBJ_C)
bonus : all
感谢您提供有用的建议,我修改了我的 Makefile :
CLIENT = client
SERVER = server
CC = gcc
FLAGS = -Wall -Werror -Wextra
INC = -I$(LIBFT_DIR) -I$(HEADER_DIR)
LIBFT = $(LIBFT_DIR)libft.a
LIBFT_DIR = ./libft/
HEADER_DIR = ./includes/
HEADER_LIST = minitalk.h
HEADERS = $(addprefix $(HEADER_DIR), $(HEADER_LIST))
SRC_DIR = ./srcs/
SRC_S = server.c \
#change definition of OBJ
OBJ_S = $(SRC_S:.c=.o)
SRC_C = client.c \
OBJ_C = $(SRC_C:.c=.o)
all : $(SERVER) $(CLIENT)
#added $(OBJ_S), $(OBJ_C)
$(SERVER) : $(LIBFT)
$(CC) $(FLAGS) $^ -o $@ $(OBJ_S)
$(CLIENT) :$(LIBFT)
$(CC) $(FLAGS) $^ -o $@ $(OBJ_C)
%.o : $(SRC_DIR)%.c $(HEADERS)
@$(CC) $(CFLAGS) $(INC) -c -o $@ $<
$(LIBFT):
@$(MAKE) -C $(LIBFT_DIR) all
clean :
@$(MAKE) -C $(LIBFT_DIR) clean
@rm $(OBJ_S) $(OBJ_C)
fclean :
@$(MAKE) -C $(LIBFT_DIR) fclean
@rm $(OBJ_S) $(OBJ_C)
bonus : all
但同样的错误仍然发生。我试图通过比较命令行编译字符串和我的makefile来找到问题。如果解决了我会在这里写。
我修好了!问题是 S_SRC/C_SRC 定义中的“\”字符。 它将下一行附加到当前行。结果如下:
S_SRC : server.c S_OBJ =
C_SRC : client.c C_OBJ =
删除它,现在我的 makefile 可以正常工作了。
【问题讨论】:
-
make向您显示编译命令,它显然缺少server.o。对于目标$(SERVER),$(CC) $(FLAGS) $^ -o $@可能需要为$(CC) $(FLAGS) $^ -o $@ $(OBJ_S)。对目标$(CLIENT)做类似的事情。 -
哦,我错过了。太感谢了!但同样的错误仍然发生。也许存在另一个问题。
-
如果您遇到困难,请单独提出一个问题。我很确定你不会被卡住。在命令行中练习,直到正确为止,然后将其编码到 makefile 中。
-
好主意。我会试试的。感谢您的帮助!
-
这不是 Makefile 错误,"make" 只是报告后续错误。正如其消息告诉您的那样,实际错误是您链接的模块中没有
main()。您可能想要更正问题的标题和散文,并在 Jeff 的评论之后添加更改后的 Makefile,以便我们可以按照您现在的内容进行操作。 Edit你的问题,记得添加,不要删除旧版本。