Makefile编译报错arm64架构不存在_main符号,server.c有main函数如何解决
Makefile编译Undefined symbols for architecture arm64错误修复
报错信息
执行make编译时出现如下链接错误:
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函数,项目目标是实现小型服务端-客户端程序,需要同时编译server和client两个可执行文件。
初始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
第一次修改尝试
调整了OBJ变量定义逻辑和链接参数,修改后的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规则继续排查。
最终解决方案
问题根源为SRC_S/SRC_C变量定义末尾多余的\字符:Makefile中\是行拼接符,会将下一行内容拼接到当前行,最终变量实际定义结果为:
S_SRC : server.c S_OBJ = C_SRC : client.c C_OBJ =
导致源文件和目标文件变量定义异常,编译阶段没有生成server.o/client.o,链接时只链接了libft.a,找不到main函数符号。
删除SRC_S = server.c和SRC_C = client.c末尾多余的\字符后,Makefile运行正常。
内容的提问来源于stack exchange,提问作者acho
相关产品推荐
相关产品推荐

