【问题标题】:Compiling Small Gcc Project on Windows Using MinGW使用 MinGW 在 Windows 上编译小型 Gcc 项目
【发布时间】:2010-11-17 10:42:40
【问题描述】:

所以我已经用 C++ 编程将近 2 年了,而在整个过程中,我一直很高兴使用具有可爱的项目设置和自动链接等的 IDE (VS)。我一直远离任何需要我通过 makefile 编译的外部库,或者至少是那些用于 linux 环境/其他编译器的外部库。

无论如何,我现在想使用一个超级方便的实用程序(Bob Jenkins Perfect Minimal Hash),但它需要我通过 makefile 进行编译,不仅如此,还需要使用 g++ 编译器。

我继续获得了 mingW32-make 实用程序,现在正试图让它工作。我现在在哪里:

  • minGW 安装成功
  • 成功调用 make 实用程序
  • 未能成功制作项目。

我得到的错误是:

C:\gen_progs\ph>mingw32-make

mingw32-make: *** 没有制定规则 目标lookupa.c', needed by lookupa.o'。停下来。

还有 makefile 本身:

CFLAGS = -O

.cc.o:
    gcc $(CFLAGS) -c $<
    
O = lookupa.o recycle.o perfhex.o perfect.o

const64 : $(O)
    gcc -o perfect $(O) -lm

# DEPENDENCIES

lookupa.o : lookupa.c standard.h lookupa.h

recycle.o : recycle.c standard.h recycle.h

perfhex.o : perfhex.c standard.h lookupa.h recycle.h perfect.h

perfect.o : perfect.c standard.h lookupa.h recycle.h perfect.h

现在这个错误似乎是合理的,至少从我对 makefile 的最低理解来看,我有所有引用的 .c、.h 文件,但是我没有任何 .o 文件,而且似乎没有任何说明如何制作这些。所以我的问题是:

我是否调用 make 实用程序错误?还是我需要先编译目标文件?或者...我需要在 make 文件中添加一些内容吗?

我再次拥有所有引用的 .c 和 .h 文件。

编辑:很抱歉,我实际上错过了那个特定的文件,它似乎已经消失了。但是,将其添加回来是我现在得到的错误:

c:\gen_progs\ph>mingw32-make 
cc -O   -c -o lookupa.o lookupa.c 
process_begin: CreateProcess(NULL, cc -O -c -o lookupa.o lookupa.c, ...) failed.
    
make (e=2): The system cannot find the file specified. 
mingw32-make: *** [lookupa.o] Error 2

【问题讨论】:

  • 你试过用 Cygwin 吗?
  • Make 抱怨它找不到lookup.c,而不是它无法制作lookup.o(C 文件有一个内置规则)。
  • 你对此感到抱歉,我猜是在尝试使其文件被删除的某个地方。有关新错误,请参阅我的编辑。 @Freddy:没有试过Cygwin,如果没有解决这个错误我会尝试。

标签: c gcc makefile mingw


【解决方案1】:

我不认为没有 .o 文件是问题所在。 Make 将从源文件(冒号右侧的文件)生成它们。

您的直接问题似乎是 make 无法归档文件“lookupa.c”。根据您发布的规则,在我看来,该文件应该与 makefile 位于同一目录中,但事实并非如此。您需要弄清楚该文件在哪里,以及如何获取它。

(出于某种原因,我脑海中出现了 Wile E. Coyote 坐在他的电脑前,看到那个文件名,抬起头,然后被铁砧贴上的画面)。

【讨论】:

  • 谢谢,修复了这个错误,现在是另一个错误,实际上是原来的错误。不知何故,随着我随机尝试制作项目,.c 文件被删除了。现在回来了。
【解决方案2】:

关于您的错误“process_begin: CreateProcess(NULL, cc -O -c -o lookupa.o lookupa.c, ...) failed.”

这是因为 make 实用程序想要使用“cc”编译器来编译您的程序,但该编译器不是 Mingw 包的一部分。

解决方案:将“.cc.o:”更改为“.c.o:”。这改变了隐式规则,该规则告诉 Make 在编译 .c 文件时使用什么编译器(下一行是 gcc)(原行告诉它如何编译 .cc 文件)。

【讨论】:

  • 非常感谢,工作就像一个魅力。每天都学点东西!
【解决方案3】:

在命令行中输入make -DCC=gcc 或将CC=gcc 添加到Makefile 的顶部也可以解决问题。 Make 内置的处理 C 源代码的规则都使用变量 CC 命名 C 编译器,即使在 Gnu Make 中也出于向后兼容性的原因,默认为“cc”。

看起来原始 Makefile 作者试图通过提供自定义规则来编译 .cc 文件来解决该问题,但由于项目中没有 .cc 文件,因此该规则实际上并未被使用。

为CC 指定正确的值优于将明确的规则命名为.c 文件恕我直言,因为Makefile 通常更易于使用和维护,并且在指定的信息最少的情况下是最便携的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多