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

时间:2009-08-06 17:50:18

标签: c gcc makefile mingw

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

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

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

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

我得到的错误是:

  

C:\ gen_progs \ pH值GT;的mingw32-MAK​​E

     

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

3 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:7)

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

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

CC指定正确的值优于将明确规则修改为名称.c文件恕我直言,因为Makefile通常更易于使用和维护,并且在指定尽可能少的信息时最便于使用

答案 2 :(得分:1)

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

您的直接问题似乎是make无法将文件存档为“lookupa.c”。根据您发布的规则,我认为该文件应该与makefile位于同一目录中,但事实并非如此。你需要找出那个文件的位置,以及如何在那里找到它。

(出于某种原因,我有一个Wile E. Coyote的心理形象,他坐在他的电脑前,看到那个文件名,抬头,然后用铁砧贴上灰泥)。