5

所以我已经用 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
4

3 回答 3

10

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

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

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

于 2009-08-06T18:29:31.287 回答
8

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

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

恕我直言,为文件指定正确的值CC优于将显式规则固定为文件命名,.c因为 Makefile 通常更易于使用和维护,并且在指定的信息最少时最可移植。

于 2009-08-06T20:19:38.343 回答
1

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

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

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

于 2009-08-06T18:05:45.747 回答