【问题标题】:Makefile undefined references with 3 libraries带有 3 个库的 Makefile 未定义引用
【发布时间】:2020-04-25 19:08:38
【问题描述】:

我做了一个旧项目并试图让它工作,但由于某种原因它没有。

生成文件:

### COMPILATION ###
C      = gcc
FLAGS  = -Wall -Wextra -Werror

### EXECUTABLE ###
NAME   = fdf

### INCLUDES ###
LIBFT  = libft
OBJ_PATH  = objs
HEADER = incl
SRC_PATH  = srcs
LIBFTMATH_PATH = libftmath
MLX = libmlx

### SOURCES ###
SOURCES = main.c \
          parsing_map.c \
          fdf.c \
          ft_draw.c \
          color_map.c \
          ft_color_converter.c \
          ft_settings.c \
          user_hook.c \

### OBJECTS ###

SRCS = $(addprefix $(SRC_PATH)/,$(SOURCES))
OBJS = $(addprefix $(OBJ_PATH)/,$(SOURCES:.c=.o))

### COLORS ###
NOC         = \033[0m
BOLD        = \033[1m
UNDERLINE   = \033[4m
BLACK       = \033[1;30m
RED         = \033[1;31m
GREEN       = \033[1;32m
YELLOW      = \033[1;33m
BLUE        = \033[1;34m
VIOLET      = \033[1;35m
CYAN        = \033[1;36m
WHITE       = \033[1;37m

### RULES ###

all: tmp $(NAME)

$(NAME): $(OBJS)
    @echo "$(GREEN)Creating lib files$(CYAN)"
    @make -C $(LIBFT)
    @make -C $(LIBFTMATH_PATH)
    @make -C $(MLX)
    @$(CC) $(FLAGS) -L $(LIBFT) -lft -L $(MLX) -lmlx -L $(LIBFTMATH_PATH) -lftmath  -o $@ $<
    @echo "$(GREEN)Project successfully compiled"

tmp:
    @mkdir -p objs

$(OBJ_PATH)/%.o: $(SRC_PATH)/%.c $(HEADER)/$(NAME).h
    @$(CC) $(FLAGS) -c -o $@ $<
    @echo "$(BLUE)Creating object file -> $(WHITE)$(notdir $@)... $(RED)[Done]$(NOC)"

clean:
    @echo "$(GREEN)Supressing libraries files$(CYAN)"
    @make clean -C $(LIBFT)
    @make clean -C $(LIBFTMATH_PATH)
    @rm -rf $(OBJ_PATH)

fclean:
    @echo "$(GREEN)Supressing libraries files$(CYAN)"
    @rm -rf $(OBJ_PATH)
    @rm -f $(NAME)
    @make fclean -C $(LIBFT)
    @make fclean -C $(LIBFTMATH_PATH)

re: fclean
    @$(MAKE) all -j

.PHONY: temporary, re, fclean, clean

文件夹层次结构是这样组织的: 项目文件夹包含我编译的 3 个库,包含项目 .c 文件的 srcs 文件夹和包含头文件 fdf.h 的 incl 文件夹。

您可以看到项目 here 的树状结构,如果这是问题的原因,我将添加到问题中,但从我看来,这似乎与库链接到项目的方式有关.

我收到以下错误:

main.c:(.text+0x99): undefined reference to `ft_isdigit'
main.c:(.text+0x134): undefined reference to `ft_strndup'

等,比如 Makefile 无法获取 .h

非常感谢您的帮助

编辑:感谢 MadScientist,我能够摆脱所有错误,但现在我有了:

mlx_init.c:(.text+0x2c): undefined reference to `XShmQueryVersion'
mlx_init.c:(.text+0x11c): undefined reference to `XShmPixmapFormat'
libmlx/libmlx.a(mlx_init.o): In function `mlx_init':
mlx_init.c:(.text+0x14f): undefined reference to `XOpenDisplay'
mlx_init.c:(.text+0x1ca): undefined reference to `XInternAtom'
mlx_init.c:(.text+0x2ee): undefined reference to `XCreateColormap'
libmlx/libmlx.a(mlx_new_window.o): In function `mlx_new_window':
mlx_new_window.c:(.text+0x91): undefined reference to `XCreateWindow'
mlx_new_window.c:(.text+0xbb): undefined reference to `XStoreName'
mlx_new_window.c:(.text+0xd0): undefined reference to `XSetWMProtocols'
mlx_new_window.c:(.text+0xfb): undefined reference to `XCreateGC'
mlx_new_window.c:(.text+0x128): undefined reference to `XMapRaised'
libmlx/libmlx.a(mlx_pixel_put.o): In function `mlx_pixel_put':
mlx_pixel_put.c:(.text+0x4b): undefined reference to `XChangeGC'
mlx_pixel_put.c:(.text+0x61): undefined reference to `XDrawPoint'
mlx_pixel_put.c:(.text+0x70): undefined reference to `XFlush'
etc

这似乎与-lmlx -lXext -lX11之间的链接有关 和 libmlx

edit2:终于用这一行解决了:

$(CC) $(FLAGS) -L $(LIBFT) -L $(MLX) -o $@ $^ -lft -lmlx -lXext -lX11 -lm

【问题讨论】:

  • 您定义C = gcc,然后使用默认的$(CC)。定义C 有什么意义?你可能想要CC = gcc
  • 这是你提出的一个有趣的观点,因为我纠正了它并且不知何故它没有导致任何错误。很奇怪。

标签: c makefile static-libraries


【解决方案1】:

这条线在很多方面都是错误的;我认为它以前没有用过:

@$(CC) $(FLAGS) -L $(LIBFT) -lft -L $(MLX) -lmlx -L $(LIBFTMATH_PATH) -lftmath  -o $@ $<

总是,总是在你的命令前加上@ 是个坏主意。至少,在您的构建真正正常工作之前,您永远不应该这样做。通过隐藏链接线,您看不到该线是错误的。如果您想要一种更灵活的方式来清理您的输出,请尝试阅读 this blog post

首先,您不应该使用$&lt;,因为它只会扩展到第一个先决条件,而不是所有先决条件。这意味着您实际上只是在链接第一个 .o 文件。您应该在链接行上使用$^,以便包含所有目标文件。

其次,几乎所有现代链接器都是“单通道”链接器,这意味着链接行上库的顺序非常重要。特别是,您应该始终将所有库选项(例如,-lfoo)添加到链接行的 end,在所有目标文件(.o$^ 如上所述)之后。

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2018-05-25
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多