【问题标题】:How do I create a executable with a make file in c如何在c中使用make文件创建可执行文件
【发布时间】:2018-08-27 10:50:19
【问题描述】:

我正在使用Makefile 创建一个可执行文件,所以当我运行可执行文件时,我只写了./ft_ls,但是得到了这个错误,下面是我的 Makefile 的代码。

“ar: ft_ls: 不合适的文件类型或格式”

但是当我创建一个库并添加我的 main.c 文件和 gcc 时,它会运行 file.so。如何从以下 Makefile 创建可执行文件?

14 NAME = ft_ls
 15
 16 SRCS =  main.c\
 17         ft_perm.c\
 18         ft_group.c\
 19         count.c\
 20         ls_l.c\
 21         ls.c\
 22         ls_a.c\
 23         ls_rr.c\
 24         ls_r.c\
 25         ls_r_m.c\
 26         multi_args_l.c\
 27         ft_anigma.c\
 28         ls_g.c\
 29         ft_printf/ft_printf.c\
 30         ft_printf/precision.c ft_printf/mask_unicode.c ft_printf/width.c ft_printf/null_char.c ft_printf/wstr_precision.c\
 31         ft_printf/flags/flags.c ft_printf/flags/type_flags.c ft_printf/flags/checking_for.c ft_printf/n_func.c\
 32         ft_printf/conv/applying.c ft_printf/conv/conversion.c ft_printf/conv/zero_conv.c\
 33         ft_printf/alloc/ft_alloc.c ft_printf/alloc/to_str.c ft_printf/libft/ft_atoi.c ft_printf/alloc/ft_del_str.c\
 34         ft_printf/libft/ft_strncpy.c ft_printf/libft/ft_strcmp.c libft/ft_strncmp.c ft_printf/libft/ft_putstr.c ft_printf/color_part_two.c \
 35         ft_printf/libft/ft_strcpy.c ft_printf/libft/ft_strlen.c ft_printf/libft/ft_strdup.c \
 36         ft_printf/test/h_test.c ft_printf/test/jz_test.c ft_printf/test/l_test.c ft_printf/test/basic_test.c \
 37         ft_printf/itoa/ft_itoa_ll.c ft_printf/itoa/reverse.c ft_printf/libft/ft_strwdup.c ft_printf/color.c \
 38
 39 OB =    main.o \
 40         ft_perm.o\
 41         ft_group.o\
 42         count.o\
 43         ls_l.o\
 44         ls.o\
 45         ls_a.o\
 46         ls_rr.o\
 47         ls_r.o\
 48         ls_r_m.o\
 49         multi_args_l.o\
 50         ft_anigma.o\
 51         ls_g.o\
 52         ft_printf.o\
 53         type_flags.o applying.o basic_test.o checking_for.o conversion.o \
 54         flags.o ft_alloc.o ft_atoi.o mask_unicode.o n_func.o\
 55         ft_printf.o ft_strcmp.o ft_strcpy.o to_str.o wstr_precision.o\
 56         ft_strdup.o ft_strlen.o ft_strncpy.o h_test.o jz_test.o l_test.o precision.o \
 57         reverse.o width.o ft_itoa_ll.o null_char.o zero_conv.o ft_strwdup.o color.o \
 58         ft_putstr.o color_part_two.o ft_del_str.o ft_strncmp.o\
 59
 60 FLAGS = -Werror -Wall -Wextra
 61
 62 $(NAME):
 63     gcc  $(FLAGS) $(SRCS)  -o $(NAME)
 64
 65 all:    $(NAME)
 66
 67 clean:
 68     rm -f $(OB)
 69
 70 fclean: clean
 71     rm -f $(NAME)
 72
 73 re:     fclean all

【问题讨论】:

  • 从您的gcc 行中删除-c,并删除ar 行。 FWIW,-c 的意思是“编译后停止,生成目标文件”,而不是尝试将所有已编译代码链接到可执行文件的默认行为。 ar 命令实际上是“归档”的缩写......因为静态库 (.a) 实际上只是一个稍微特殊的目标文件 tar 归档。
  • 我试过这样做,但这就是我得到的架构 x86_64 的未定义符号:“_ft_printf”,引用自:main-4da9d1.o 中的 _main_malti main-4da9d1.o 中的_main“_ft_strcmp”,引用来自:main-4da9d1.o 中的 _main_malti 主 4da9d1.o 中的 _main "_ls",引用自:main-4da9d1.o 中的 _main
  • 好吧,这才是真正的问题;如果这意味着您正在使用 Mac(以便拥有通用二进制文件),那将是添加到问题中的一个很好的标签。 x86_64 是您正在开发的平台吗?您是否在 CFLAG 中设置了任何架构标志? (例如,-m32 或 -m64)

标签: makefile


【解决方案1】:
 66 $(NAME):
 67     gcc -c $(FLAGS) -o ft_ls $(MAIN) $(OBJ)
 68     ar rc $(NAME) $(OB)

在上面的 sn-p 中,您有一个没有任何依赖关系的目标 $(NAME) [= ft_ls] 和两个命令,它们试图创建一个可执行文件和一个库。此外,您定义了一个名为 OB 的变量,但引用了一个名为 OBJ 的变量。我怀疑你应该只创建一个可执行文件,像这样

$(NAME): $(MAIN) $(OB)
    gcc $(FLAGS) -o ft_ls $(MAIN) $(OB)

如果您使用的是 GNU make,那么您可以使用 $@ 作为目标,使用 $^ 作为依赖项(这使您的 Makefile 更易于维护),就像这样

$(NAME): $(MAIN) $(OB)
    gcc $(FLAGS) -o $@ $^

不清楚您的目标文件是如何编译的。如果您只有一堆 .c 文件并需要一些 .o 文件,那么可能会用到 suffix rule(请参阅 here),所以您需要类似

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

【讨论】:

  • 哈!我什至没有注意到OBJ 被打错了。由于OBJ 扩展为空白字符串,因此会出现 OP 的链接错误(在 cmets 中进行了说明);正确答案需要将OB 列表重命名为OBJ 或更改引用以正确使用OB(或此答案的自动生成变量)
  • 感谢大家的帮助,现在可以使用文件了。代码在上面
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
相关资源
最近更新 更多