C 使用库生成文件:链接器命令失败

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

您好,我无法使我的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 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