C 使用库生成文件:链接器命令失败
您好,我无法使我的Makefile与一起工作C 使用库生成文件:链接器命令失败,c,makefile,C,Makefile,您好,我无法使我的Makefile与一起工作 $(CC)$(CFLAGS)$(INC)$(OBJS)$(MLX_LNK)-o$(NAME)。 有一个 终端I上的命令是“maketest1” 我还尝试了$(CC)$(CFLAGS)-I$(HEADER)$(OBJS)$(MLX_LNK)-o$(NAME) 但是得到 Compiling... clang -O3 -Wall -Wextra -Werror -I cub3d.h src/cub3d.o src/checks/argvcheck.o sr
$(CC)$(CFLAGS)$(INC)$(OBJS)$(MLX_LNK)-o$(NAME)。
有一个 终端I上的命令是“maketest1” 我还尝试了$(CC)$(CFLAGS)-I$(HEADER)$(OBJS)$(MLX_LNK)-o$(NAME) 但是得到
Compiling...
clang -O3 -Wall -Wextra -Werror -I cub3d.h src/cub3d.o src/checks/argvcheck.o src/checks/parse_map.o src/libft/basics.o src/libft/basics_bis.o src/libft/get_next_line.o src/utils/errors.o -L minilibx_opengl -lmlx -framework OpenGL -framework AppKit -o cub3D
Undefined symbols for architecture x86_64:
"_init_cube", referenced from:
_init_game in cub3d.o
"_write_errors", referenced from:
_verify_line in argvcheck.o
_ft_parse_cub in argvcheck.o
_my_get_next_line in get_next_line.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
非常感谢你的帮助
此处生成文件:
NAME = cub3D
HEADER = cub3d.h
CC = clang
CFLAGS = -O3 -Wall -Wextra -Werror
INC = -I $(MLX-DIR) -I $(HEADER)
MLX_DIR = minilibx_opengl
MLX_LNK = -L $(MLX_DIR) -lmlx -framework OpenGL -framework AppKit
SRCS = src/main.c \
src/checks/argvcheck.c \
src/libft/basics.c \
src/libft/get_next_line.c \
src/utils/errors.c \
OBJS = $(SRCS.c=.o)
all: $(NAME)
mlx: $(MLX-DIR)
@echo "\033[34m-= Making libX.a... =-"
@make -C $(MLX_DIR)
$(NAME): ${OBJS} mlx
$(CC) $(CFLAGS) $(INC) $(OBJS) $(MLX_LNK) -o $(NAME)
test1: $(NAME)
$(NAME) ; ./a.out maps/test1.cub
clean:
@echo "\033[0;31mCleaning..."
rm -f $(OBJS)
# + $(B_OBJ)
# + rm -f bitmap.bmp
@echo "\033[0m"
fclean: clean
@echo "\033[34m-= Cleaning mlx... =-"
@make clean -C $(MLX_DIR)
@echo "\033[0;31mRemoving executable..."
rm -f $(NAME)
@echo "\033[0m"
re: fclean all
.PHONY: all clean fclean re
````
首先,这是错误的:
OBJS = $(SRCS.c=.o)
您缺少一个:
此处,它应该是$(SRCS:.c=.o)
,因此,OBJS
将为空
其次,这目前并没有给您带来问题,但并不正确:在调用子MAKE时,您应该始终使用$(MAKE)
而不是像MAKE
这样的原始命令
最后,您通过将结果嵌入makefile中间来编写问题的方式使得阅读变得非常困难。请先放置makefile,然后为不同的食谱尝试划分不同的部分。您需要包含打印出来的命令行(请剪切并粘贴精确的命令行!),以便我们查看正在运行的命令(扩展所有变量)。通常情况下,如果你仔细观察,问题会变得非常明显
例如,在本例中,您会看到链接行中实际上没有对象文件,因此应该清楚的是,$(OBJS)
变量没有正确设置
编辑
好的,谢谢您显示命令行。现在,您应该仔细查看它,您将看到您的问题:)。看看这里:
clang -O3 -Wall -Wextra -Werror -I -I cub3d.h src/cub3d.o ...
你觉得这样对吗?具体看一下-I-I cub3d.h
。。。这看起来对吗
发生的情况是,编译器希望路径名位于-I
之后,但没有路径名,因此它将第二个-I
视为路径名。然后将文件cub3d.h
视为源文件,并且不能将源文件与目标文件链接
那么为什么看起来像这样呢?查看您的makefile:
INC = -I $(MLX-DIR) -I $(HEADER)
因此缺少的是$(MLX-DIR)
的位置。这个变量是什么?你有这个:
MLX_DIR = minilibx_opengl
但这不是一回事,因为它使用下划线,而引用使用破折号。所以,让他们一样
然后您将看到,将文件作为参数放入
-I
是无效的。它需要一个目录来搜索头文件。如果您想包含标题,您必须在源代码中添加#包含“cub3d.h”
,而不是将其添加到编译行。感谢缺少的“:”,现在我知道了执行人员消失的原因。很抱歉造成混淆,这里有一个更干净的Makefile。我还应该说,在链接行中添加-I
选项是无用的。链接器不搜索头,编译器搜索头<代码>-I选项应添加到编译行。如果需要,您可以将其添加到CFLAGS
,或者您可以设置CPPFLAGS
变量,而不是使用INC
(CPPFLAGS
是保存预处理器选项的默认变量,如-I
或-D
)。非常感谢您的这一课,它现在终于可以正常工作了!
MLX_DIR = minilibx_opengl