【问题标题】:Can't get my C program to compile. Makefile error无法编译我的 C 程序。生成文件错误
【发布时间】:2013-03-24 00:53:48
【问题描述】:

我正在尝试创建一个新的 C 程序,但无法编译该程序。这是因为我的 makefile 似乎是错误的。我不断收到“没有规则可以让目标‘全部’”和“没有规则可以让目标‘干净’”。这是我目前所拥有的:

主程序:

#include <stdio.h>

Sleepy() {

main (); {
    printf("Hello world");
}

}

标题(虽然我还没有做任何事情):

#ifndef SLEEPY_H_
#define SLEEPY_H_



#endif /* SLEEPY_H_ */

还有 Makefile:

CC = gcc
CFLAGS = -c

Sleepy.o: Sleepy.c Sleepy.h
$(CC) $(CFLAGS) Sleepy.c

Sleepy: Sleepy.o
$(CC) -o Sleepy.exe Sleepy.o


all: Sleepy

clean:
rm -rf *.0 a.out

make = all

我一直在阅读各种教程,但我似乎无法让它发挥作用。有人可以帮我解决这个问题吗?

【问题讨论】:

  • makefile 问题修复后,会收到编译器的投诉。您的来源不正确。
  • @DanielFischer 我认为这是 Sleepy.c?无论如何,我不应该在这里发布这样的问题吗? 2 票反对似乎是这样说的。
  • @blutuu 您在sleepy.c 中遇到了一些一阶问题。首先,您需要从Sleepy() 中获取main,即应该独立定义主函数。您是否要编写CTOR?接下来,main 有一个semi-colon,如main ();。为了您的目标,请删除分号。 main 应该返回一个整数,因此,请定义 int main() 并在 main 的末尾执行 return 0;。最后,在您的 makefile 中,您可以在 makefile 的末尾删除 make = all
  • 我想它叫做Sleepy.c,它是你在“主程序”下列出的。 Ganesh 让我无需在此处列出错误(但您最好将其定义为 int main(void) 而不仅仅是 int main())。在您的makefile 中,在clean 下,删除*.0,这很可能应该是*.o。此外,make = all 不应该在 makefile 中,并且可能 all 目标必须是它工作的第一个目标(不是 make 专家)。

标签: c makefile


【解决方案1】:

要实现编译,需要进行以下更改。

Sleepy.c

#include <stdio.h>

int main (void) {
    printf("Hello world");
}

生成文件

CC = gcc
CFLAGS = -c

all: Sleepy

Sleepy.o: Sleepy.c Sleepy.h
    $(CC) $(CFLAGS) Sleepy.c

Sleepy.exe: Sleepy.o
    $(CC) -o Sleepy.exe Sleepy.o

clean:
    rm -rf *.o Sleepy.exe

请注意Makefileclean 规则的变化。您必须删除可执行文件 Sleepy.exe

注意:Sleepy.oSleepy 的规则应该用TAB 而不是空格来偏移。否则,你会遇到这个错误:makefile:5: *** missing separator. Stop

【讨论】:

  • 明白。 0 是一个错误,我修复了它。即使仍然有更改,也没有编译。
  • 另一件事;这应该从命令提示符运行吗?因为我使用的是 Eclipse。
  • @blutuu .. 请查看我的最新更新。这对你有用吗?
  • 一开始是不行的,所以我就是把项目删了重做。通过您的 makefile 配置,我能够编译程序。我认为如果我早点这样做,许多其他建议都会奏效。再次感谢您的帮助。
  • @blutuu... 太好了.. 很高兴您的项目启动并运行.. 编程愉快 :-)
【解决方案2】:

试试这个,

All: sleepy

sleepy: sleepy.c sleepy.o sleepy.h 
        gcc sleepy.c -o sleepy
clean:
        rm -f *.o

【讨论】:

  • gcc -c sleepy.c -o sleepy.exe 将创建一个目标文件而不是可执行文件。编译步骤后无法运行sleepy.exe
  • @Ganesh 嘿,谢谢。我不知道。我已经做出了改变。那你能告诉我应该如何使“sleepy.exe”成为可执行文件吗?
  • @SRJ .. 即使您更新的评论也不准确,因为sleepy 将只是一个目标文件。要生成可执行文件,请使用gcc -o sleepy sleepy.c,即删除-c,因为这会告诉编译器compile only
  • 我想还有很多东西要学。我没有考虑太多关于 Makefile 的细节。再次感谢
猜你喜欢
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多