所以我已经用C ++编程了将近2年,而且我有幸使用IDE(VS)和可爱的项目设置以及自动链接等。我总是远离任何需要我通过makefile编译的外部库,或者至少是那些用于linux环境/其他编译器的库。
无论如何我现在想要使用超级方便的实用程序(Bob Jenkins Perfect Minimal Hash)但它需要我通过makefile编译,不仅如此,而是使用g ++编译器。
我继续使用mingW32-make实用程序,现在正试图让它工作。我现在在哪里:
我得到的错误是:
C:\ gen_progs \ pH值GT;的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
答案 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的心理形象,他坐在他的电脑前,看到那个文件名,抬头,然后用铁砧贴上灰泥)。