Makefile优化,以便尽快快速编译库?

时间:2017-12-11 21:52:38

标签: c makefile

我可以使用任何方法来减少我的图书馆编辑的时间吗?

我的旧Makefile运行1.86秒,总计达到5.147。 我改变后

%.o: %.c
    $(CC) $(FLAGS) -c -o $@ $<

分为:         @ $(CC)$(FLAGS)-c $(OBJ:。o = .c)

并添加@以使所有输出静音,我的新Makefile需要1.40秒才能运行,最多可达3.481秒。

我想知道是否有任何方法可以优化我的makefile以简化其运行速度或使其更加“有用”#34 ;?我在哪里可以学习微调,以获得稍快的编译程序?

https://github.com/Hourai42/libft/blob/master/Makefile

NAME = libft.a
FLAGS = -Wall -Wextra -Werror
CC = gcc
OBJ = ft_strrchr.o ft_putstr.o ft_strcmp.o ft_strlcat.o ft_memcpy.o \
ft_strequm.o ft_memmove.o ft_strsplit.o ft_strncpy.o ft_lstmap.o \
ft_lstadd.o ft_striter.o ft_strstr.o ft_isdigit.o ft_putnbr.o \
ft_memccpy.o ft_strdel.o ft_nmbwrd.o ft_memchr.o ft_bzero.o \
ft_isalnum.o ft_putstr_fd.o ft_lstiter.o ft_lstdelone.o ft_toupper.o 
\
ft_strcpy.o ft_lstnew.o ft_strdup.o ft_putnbr_fd.o ft_striteri.o \
ft_strmap.o ft_putendl_fd.o ft_memdel.o ft_strnstr.o ft_putchar.o \
ft_isascii.o ft_strlen.o ft_strsub.o ft_strnew.o ft_memalloc.o 
ft_putendl.o \
ft_strncat.o ft_itoa.o ft_strncmp.o ft_memcmp.o ft_strtrim.o 
ft_strequ.o 
\
ft_putchar_fd.o ft_memset.o ft_isalpha.o ft_strcat.o ft_tolower.o \
ft_strnequ.o ft_strjoin.o ft_atoi.o ft_strclr.o ft_strmapi.o \
ft_isprint.o ft_lstdel.o ft_strchr.o ft_mallocwrd.o ft_countplace.o \
ft_isprime.o ft_hassqrt.o ft_fibonacci.o ft_recursive_power.o \
ft_recursive_factorial.o

all: $(NAME)

$(NAME): 
    @$(CC) $(FLAGS) -c $(OBJ:.o=.c)
    @ar rc $(NAME) $(OBJ)
    @ranlib $(NAME)

clean:
    @/bin/rm -f $(OBJ)

fclean: clean
    @/bin/rm -f $(NAME)

re: fclean all

.PHONY: clean fclean re

1 个答案:

答案 0 :(得分:0)

  1. 重做只需要的东西(巨大的改进)。
  2. 使用parallel make(如果在多核CPU上运行,则会有显着改进)。
  3. 每个配方仅调用一个单独的shell(中等到次要的改进)。
  4. 示例:

    NAME = libft.a
    FLAGS = -Wall -Wextra -Werror
    CC = gcc
    SRCS = $(wildcard *.c)
    OBJS = $(patsubst %.c,%.o,$(SRCS))
    
    .PHONY: all clean ultraclean
    
    all: $(NAME)
    
    %.o: %.c
        @$(CC) $(FLAGS) -c -o $@ $<
    
    $(NAME): $(OBJS)
        @ar rc $(NAME) $^ && \
        ranlib $(NAME)
    
    clean:
        @/bin/rm -f $(OBJS)
    
    ultraclean:
        @/bin/rm -f $(OBJS) $(NAME)
    

    然后,如果你有,让我们说,6核和超线程:

    $ make -j12
    

    注意:当然,使用并行制作时,请不要像使用{{1}那样并行化清理目标(cleanultraclean)和构建目标(all)。 } target。