首页 > 解决方案 > Makefile没有创建可执行文件

问题描述

所以我一直在搜索堆栈溢出和互联网的其余部分,虽然我发现了与我类似的问题,但我还没有找到一个适合我的问题的答案。我只是在学习如何创建 makefile,希望能提供任何帮助。我首先创建了一个带有变量“objects”的makefile,当我输入make时它会编译.c文件创建.o文件,但是,没有生成可执行文件。这就是我的 makefile 的样子:

objects = user_interface.o interacts.o linked_list_funcs.o

proj4ex: $(objects)
<tab> cc -o proj4ex $(objects)
user_interface.o: user_interface.c header.h
<tab> cc -c user_interface.c
interacts.o: interacts.c header.h
<tab> cc -c interacts.c
linked_list_funcs.o: linked_list_funcs.c header.h
<tab> cc -c linked_list_funcs.c
clean:
<tab> rm proj4ex $(objects)

然后,我尝试将我的 makefile 更改为完全相同的内容,但使用文件名而不是变量“对象”。将 make 与这种新形式的 makefile 一起使用时,它似乎可以编译,但我的代码出现错误。我不确定我是否误解了这个错误,但我相信这意味着我的变量“debugMode”被声明了几次,但事实并非如此。这是我在使用列出文件名的makefile时得到的

在此处输入图像描述

我想知道我的原始 makefile 是否没有正确读取其他文件?只是在这里很困惑,希望得到任何帮助,谢谢!

标签: cmakefilegnu-make

解决方案


就像约瑟夫说的,编译器告诉你你多次定义了“debugMode”标识符。您可以判断,因为它引用了 .bss 部分,该部分与二进制文件有关,而不是 make。此外,链接器ld显然是该步骤失败的原因,这是有道理的,因为这一个链接器错误。

话虽如此,我将为您的 makefile 提出以下建议。在内部,Make 已经知道如何编译 c 文件,它看起来像这样:

%.o: %.c
    $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $^

该配方将从 c 文件构建所有必要的目标文件,但同样,Make 已经知道这一点。如果您要一路写出一个食谱,那应该是因为您要添加项目所需的额外内容。您希望将编译器指定为 $(CC) ,这样当您的用户编译项目时,他们可以像这样指定他们选择的编译器:make CC=icc或其他。

不过要强调要点,问题出在您的代码中,而不是makefile。


推荐阅读