Makefile неопределенные ссылки с 3 библиотеками - PullRequest
0 голосов
/ 25 апреля 2020

Я взял старый проект и попытался заставить его работать, но по какой-то причине это не помогло.

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, которая содержит файлы проекта. c и папку incl, которая содержит заголовок fdf.h.

Вы можете увидеть древовидность проекта здесь , который я добавлю к вопросу, если это является причиной проблемы, но из того, что я вижу, это, похоже, связано с способ, которым библиотеки связаны с проектом.

Я получаю следующие ошибки:

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

et c, например, если Makefile не смог получить .h

Большое спасибо за ваш help

edit: благодаря 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

1 Ответ

1 голос
/ 25 апреля 2020

Эта строка неверна по-разному; Я не думаю, что это когда-либо работало раньше:

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

Это всегда, всегда плохая идея - ставить перед вашими командами @. По крайней мере, вы никогда не должны делать это, пока ваша сборка не будет работать правильно Скрывая линию связи, вы не можете видеть, что линия неправильна. Если вам нужен более гибкий способ очистки выходных данных, попробуйте прочитать этот пост в блоге .

Во-первых, вам не следует использовать $<, поскольку это распространяется только на первое предварительное условие, не все предпосылки. Это означает, что вы на самом деле связываете только первый .o файл. Вы должны использовать $^ в строке ссылки, чтобы все объектные файлы были включены.

Во-вторых, практически все современные компоновщики являются компоновщиками "однопроходного", что означает, что порядок библиотек в строке компоновки очень важный. В частности, вы всегда должны добавлять все параметры библиотеки (например, -lfoo) к end строки ссылки после всех объектных файлов (.o или $^, как указано выше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...