You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:36:03