C ++编译错误:找不到.o文件

时间:2013-05-30 21:41:21

标签: c++ makefile g++

我正在尝试使用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

3 个答案:

答案 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以了解正在发生的事情。