【问题标题】:C makefile error "Undefined symbols for architecture arm64: "_main""C makefile 错误“架构 arm64 的未定义符号:“_main””
【发布时间】: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你的问题,记得添加,不要删除旧版本。

标签: c makefile


【解决方案1】:

问题标题表明您关注的是诊断信息的错误部分。关键部分是...

Undefined symbols for architecture arm64:
  "_main"

...由

加强
ld: symbol(s) not found for architecture arm64

问题是您正在尝试构建程序,但链接器没有看到main() 函数。那么为何不? make 发出的构建输出显示只有静态库被链接,而 makefile 给人的印象是您也打算链接 server.o

$(OBJ_S) 似乎正在扩展为空。为什么会是?好吧,看看它的(唯一的)定义:

OBJ_S = $(OBJ_S:.c=.o)

您是根据它自己(空)的先前值来定义它。大概你的意思是

OBJ_S = $(SRC_S:.c=.o)

。类似的情况也适用于客户端。

可能还有其他问题。特别是,如果源位于./srcs/ 中,而不是与makefile 位于同一目录中,那么您的模式规则将不会执行您想要的操作,至少有两个不同的原因。看起来你真正想要的可能是:

%.o : $(SRC_DIR)%.c $(HEADERS)
    $(CC) $(CFLAGS) $(INC) -c -o $@ $< 

特别注意先决条件列表中的变化。尽管我还在编译命令行上重新排序了参数,但这更多的是一个约定问题,而不是正确行为。

【讨论】:

  • 哦,这是真的。某些原因我的代码仍然报告相同的错误。但这真的很有帮助。非常感谢!
猜你喜欢
  • 2014-11-05
  • 2015-11-18
  • 2014-01-22
  • 2016-09-08
  • 1970-01-01
  • 2013-10-13
相关资源
最近更新 更多