簡體   English   中英

Makefile 帶有 3 個庫的未定義引用

[英]Makefile undefined references with 3 libraries

我拿了一個舊項目並試圖讓它工作,但由於某種原因它沒有。

Makefile:

### 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 個庫,srcs 文件夾包含 project.c 文件和 incl 文件夾,其中包含 header fdf.h。

您可以在這里看到項目的樹狀結構,如果這是問題的原因,我將添加到問題中,但從我看來,這似乎與庫鏈接到項目的方式有關。

我收到以下錯誤:

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

這條線在各個方面都是錯誤的; 我認為它以前沒有用過:

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

在命令前加上@總是一個壞主意。 至少,在您的構建真正正常工作之前,您永遠不應該這樣做。 通過隱藏鏈接線,您看不到該線是錯誤的。 如果您想要一種更靈活的方式來清理您的 output,請嘗試閱讀這篇博文。

首先,您不應該使用$< ,因為它僅擴展到第一個先決條件,而不是所有先決條件。 這意味着您實際上只是在鏈接第一個.o文件。 您應該在鏈接行上使用$^ ,以便包含所有 object 文件。

其次,幾乎所有現代鏈接器都是“單通道”鏈接器,這意味着鏈接行上庫的順序非常重要。 特別是,您應該始終將所有庫選項(例如-lfoo )添加到鏈接行的末尾,在所有 object 文件(如上所示的.o$^ )之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM