【问题标题】:MAKEFILE using Library : Linker command failed使用库的 MAKEFILE:链接器命令失败
【发布时间】:2020-09-27 17:01:19
【问题描述】:

您好,我无法使用 Makefile
$(CC) $(CFLAGS) $(INC) $(OBJS) $(MLX_LNK) -o $(NAME).
有一个

clang -O3 -Wall -Wextra -Werror -I  -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
clang: error: cannot specify -o when generating multiple output files
make: *** [cub3D] Error 1

我在终端上执行的命令是“make test1”

我也试过 $(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

````

【问题讨论】:

    标签: c makefile


    【解决方案1】:

    嗯,首先这是错误的:

    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 是无效的。这需要一个 目录 来搜索头文件。如果要包含头文件,则必须在源代码中添加#include "cub3d.h",而不是将其添加到编译行中。

    【讨论】:

    • 感谢丢失的“:”,现在我知道为什么执行官消失了。很抱歉造成混乱,这里有一个更干净的 Makefile。
    • 我还应该说,在链接行中添加-I 选项是没有用的。链接器不搜索头文件,编译器搜索头文件。 -I 选项应该添加到编译行。您可以根据需要将其添加到CFLAGS,或者您可以设置CPPFLAGS 变量而不是使用INCCPPFLAGS 是默认变量,其中包含-I-D 等预处理器选项)。跨度>
    • 非常感谢这节课,现在终于可以正常使用了!
    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多