我正在尝试使用g ++在Mac上编译一个小型CPP项目(http://sourceforge.net/projects/ibmquestdatagen/),但是我收到以下错误:
sudo make -f Makefile.txt
g++ -O ran1.o expdev.o gammln.o gasdev.o poidev.o dist.o gen.o main.o command.o -lm -o gen
i686-apple-darwin11-llvm-g++-4.2: ran1.o: No such file or directory
i686-apple-darwin11-llvm-g++-4.2: expdev.o: No such file or directory
i686-apple-darwin11-llvm-g++-4.2: gammln.o: No such file or directory
i686-apple-darwin11-llvm-g++-4.2: gasdev.o: No such file or directory
i686-apple-darwin11-llvm-g++-4.2: poidev.o: No such file or directory
i686-apple-darwin11-llvm-g++-4.2: dist.o: No such file or directory
i686-apple-darwin11-llvm-g++-4.2: gen.o: No such file or directory
i686-apple-darwin11-llvm-g++-4.2: main.o: No such file or directory
i686-apple-darwin11-llvm-g++-4.2: command.o: No such file or directory
make: *** [gen] Error 1
似乎我没有所需的.o文件。有没有办法产生它们?
这是makefile:
HFILES1 = glob.h dist.h
HFILES2 = gen.h
CFILES1 = ran1.C expdev.C gammln.C gasdev.C poidev.C dist.C
CFILES2 = gen.C main.C command.C
OBJECTS1 = ran1.o expdev.o gammln.o gasdev.o poidev.o dist.o
OBJECTS2 = gen.o main.o command.o
LIBES = -lm
CC = g++
CFLAGS = -O
.SUFFIXES: .C
.C.o:
$(CC) $(CFLAGS) -c $*.c
gen: $(OBJECTS1) $(OBJECTS2)
$(CC) $(CFLAGS) $(OBJECTS1) $(OBJECTS2) $(LIBES) -o gen
test: $(OBJECTS1) test.o
$(CC) $(CFLAGS) $(OBJECTS1) test.o $(LIBES) -o test
clean:
/bin/rm $(OBJECTS1) $(OBJECTS2)
$(OBJECTS1): $(HFILES1)
$(OBJECTS2): $(HFILES1) $(HFILES2)
GNU Make 3.81
答案 0 :(得分:3)
尝试在Makefile中添加几行,如:
.SUFFIXES: .C
.C.o:
$(CC) $(CFLAGS) -c $*.c
大多数制作都有类似内置的东西(这可能就是为什么它没有出现在你得到的makefile中)但显然你的没有。它可能只识别C ++的其他扩展,例如.cpp
或.c++
。
答案 1 :(得分:2)
您可以通过删除或注释掉makefile的最后两行来检查您的“make”是否知道如何从.C文件创建.o文件。
#$(OBJECTS1): $(HFILES1)
#$(OBJECTS2): $(HFILES1) $(HFILES2)
这些行列出.h文件作为.o文件的先决条件,因此似乎make找到.h文件并假定.o文件很好用。如果“make”没有构建.o文件的隐式规则,您可以按照Jerry的答案添加它。
<强>更新强> 如果Jerry的规则在你的makefile中不起作用,试试这个:
%.o : %.C
$(CC) $(CFLAGS) -c $<
#make sure the line above is indented with a tab, not spaces
如果可行,请尝试重新添加两行。
更新2: 出于某种原因,这些模式规则似乎都不适用于OP。这是蛮力的方式:
foo.o : foo.C foo.h
$(CC) $(CFLAGS) -c foo.C
您可以为每个.C文件添加其中一个规则,将“foo”替换为相应的文件名。如果您这样做,则不需要$(OBJECTS): $(HFILES)
行。
答案 2 :(得分:1)
生成.o(目标代码)文件的“方式”是编译源文件。
您可能需要阅读this以了解正在发生的事情。