在Windows上使用MinGW编译小型GCC项目

5

我已经学习C++编程接近两年了,期间一直使用一个集成开发环境(VS)来进行项目设置、自动链接等操作。我一直避免使用需要通过makefiles编译的外部库,或者至少是那些针对Linux环境/其他编译器的库。

无论如何,现在我想要使用一个非常方便的实用工具(Bob Jenkins Perfect Minimal Hash),但它要求我使用makefiles编译,而且必须使用g++编译器。

我已经下载了mingW32-make工具并尝试让它工作。目前的情况如下:

  • 成功安装了minGW
  • 成功调用了make工具
  • 未能成功编译项目。

我得到的错误信息是:

C:\gen_progs\ph>mingw32-make

mingw32-make: *** No rule to make target lookupa.c', needed by lookupa.o'. Stop.

以下是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工具的方式不对吗?还是我需要先编译对象文件?或者...我需要在makefile中添加一些内容?
再次强调,我有所有被引用的.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吗? - Freddy
抱怨时应该说找不到lookup.c文件,而不是无法生成lookup.o文件(因为C文件有内置规则)。 - AProgrammer
抱歉,我在制作过程中不知道哪里出了问题,文件可能被删除了。请看我的编辑以获取新的错误信息。@Freddy:没有尝试过Cygwin,如果这个错误无法解决,我会尝试它。 - DeusAduro
3个回答

10

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

这是由于make工具想使用"cc"编译器来编译您的程序,但是该编译器不属于Mingw软件包。

解决方案:将".cc.o:"更改为".c.o:"。这样会改变隐式规则,告诉Make在编译.c文件时使用哪个编译器(gcc在下一行中),原始代码行则告诉它如何编译.cc文件。


非常感谢,运行得很好。每天都能学到新东西! - DeusAduro

8
在命令行中输入make -DCC=gcc或在Makefile的顶部添加CC=gcc可以解决此问题。对于处理C源代码,Make内置规则都使用名为变量CC的C编译器, 但由于向后兼容性的原因,默认情况下该变量为"cc",看起来原始Makefile作者试图通过提供自定义规则来编译.cc文件以解决这个问题,但由于项目中没有.cc文件,所以实际上并未使用该规则。根据我个人经验,指定正确的CC值比修复显式规则以命名.c文件更好,因为当指定的信息越少时,Makefile通常更易于使用、维护和移植。

1

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

你目前的问题似乎是 make 找不到文件“lookupa.c”。根据你发布的规则,这个文件应该与 makefile 放在同一个目录下,但实际上并不在那里。你需要找出这个文件在哪里,以及如何将其放在那里。

(由于某种原因,我脑海中浮现出 Wiley E. Coyote 坐在电脑前,看到这个文件名,抬头看着它,然后被一只铁砧砸中的画面)。


谢谢,那个错误已经修复了,现在又出现了另一个错误,而且是原来的那个。不知怎么回事,在我随意尝试制作项目时,.c文件被删除了。现在它已经恢复了。 - DeusAduro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接