0

我正在尝试使用 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 文件。有没有办法生成它们?

这是生成文件:

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

4

3 回答 3

4

尝试在 Makefile 中添加几行,例如:

.SUFFIXES: .C

.C.o:
    $(CC) $(CFLAGS) -c $*.c

大多数 Makes 都内置了类似的东西(这可能就是为什么它没有出现在你得到的 makefile 中),但显然你的没有。它可能只识别 C++ 的其他扩展,例如.cpp.c++

于 2013-05-30T21:46:32.580 回答
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)线。

于 2013-05-30T21:58:02.733 回答
1

生成 .o(目标代码)文件的“方法”是编译源文件。

您可能想阅读本文以了解正在发生的事情。

于 2013-05-30T21:44:55.180 回答