因此,我一直在搜索堆栈溢出和Internet的其余部分,尽管我发现了与我类似的问题,但没有找到答案能解决我的问题。我正在学习如何创建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更改为完全相同的东西,但是使用文件名而不是变量“ objects”。当用makefile的这种新形式使用make时,它似乎可以编译,但是我的代码出现错误。我不确定我是否误解了该错误,但是我相信这将意味着我的变量“ debugMode”被声明了多次,但并非多次。这是使用带有列出文件名的makefile时得到的
我想知道我的原始makefile是否不能正确读取其他文件?只是非常困惑,不胜感激,谢谢!
答案 0 :(得分:0)
就像约瑟夫所说,编译器告诉您您多次定义了'debugMode'标识符。您可以知道,因为它引用的是.bss部分,该部分与二进制文件有关,而不与make有关。另外,链接器ld
显然是该步骤失败的原因,这是有道理的,因为是一个链接器错误。
话虽如此,我会为您的makefile提出以下建议。在内部,Make已经知道如何编译c文件,它看起来像这样:
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $^
该配方将从c文件构建所有必要的目标文件,但Make再次知道这一点。如果您要一路写一个配方,那应该是因为您要添加该项目所需的额外内容。您希望将编译器指定为$(CC),以便用户编译项目时可以指定自己选择的编译器,例如:make CC=icc
或其他任何东西。
但是要强调要点,问题出在代码中,而不是makefile中。