【发布时间】: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