首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有3个库的Makefile未定义引用

带有3个库的Makefile未定义引用
EN

Stack Overflow用户
提问于 2020-04-25 19:08:38
回答 1查看 558关注 0票数 0

我采取了一个旧的项目,并试图使它发挥作用,但由于某种原因,它没有。

Makefile:

代码语言:javascript
复制
### 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文件夹。

您可以看到项目这里的树状图,如果这是问题的原因,我将添加这个问题,但从我所看到的情况来看,它似乎与库链接到项目的方式有关。

我得到以下错误:

代码语言:javascript
复制
main.c:(.text+0x99): undefined reference to `ft_isdigit'
main.c:(.text+0x134): undefined reference to `ft_strndup'

等等,就像Makefile无法获得.h一样

非常感谢你的帮助

编辑:多亏了MadScientist,我才能摆脱所有的错误,但现在我做到了:

代码语言:javascript
复制
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:最后用以下行解决了这个问题:

代码语言:javascript
复制
$(CC) $(FLAGS) -L $(LIBFT) -L $(MLX) -o $@ $^ -lft -lmlx -lXext -lX11 -lm
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-25 20:18:26

这句话在各种方面都是错误的,我认为它以前从未奏效过:

代码语言:javascript
复制
@$(CC) $(FLAGS) -L $(LIBFT) -lft -L $(MLX) -lmlx -L $(LIBFTMATH_PATH) -lftmath  -o $@ $<

总是,总是用@作为命令的前缀是个坏主意。至少,在构建真正正确之前,您不应该这样做。通过隐藏链接线,您不会看到这条线是错误的。如果您想要一种更灵活的方法来清理您的输出,请尝试阅读这篇博客文章

首先,您不应该使用$<,因为这只扩展到第一个先决条件,而不是所有先决条件。这意味着您实际上只链接第一个.o文件。您应该在链接行上使用$^,以便包括所有的对象文件。

第二,几乎所有的现代链接器都是“单通道”链接器,这意味着链接线上的库的顺序非常重要。特别是,您应该始终在所有对象文件(如上面的-lfoo)之后,将所有库选项(例如,.o)添加到链接行的末尾。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61431084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档