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 メイク 3.81

4

3 に答える 3

4

次のように Makefile に数行追加してみてください。

.SUFFIXES: .C

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

ほとんどの Make にはそのようなものが組み込まれています (これがおそらく、取得した Makefile に存在しない理由です) が、明らかにあなたのものにはありません。.cppまたはなどの C++ の他の拡張機能のみを認識する場合があり.c++ます。

于 2013-05-30T21:46:32.580 に答える
2

makefile の最後の 2 行を削除またはコメントアウトすることにより、「make」が .C ファイルから .o ファイルを作成する方法を認識しているかどうかを確認できます。

#$(OBJECTS1): $(HFILES1)
#$(OBJECTS2): $(HFILES1) $(HFILES2)

これらの行には、.o ファイルの前提条件として .h ファイルがリストされているため、make は .h ファイルを見つけて、.o ファイルが適切であると想定しているようです。「make」に.oファイルを構築するための暗黙のルールがない場合は、ジェリーの回答で示されているように追加できます。

更新: Makefile で Jerry のルールが機能しない場合は、次のことを試してください。

%.o : %.C
    $(CC) $(CFLAGS) -c $<
#make sure the line above is indented with a tab, not spaces

それが機能する場合は、2 行を再度追加してみてください。

更新 2: 何らかの理由で、これらのパターン ルールのいずれも OP に対して機能していないようです。ブルートフォースの方法は次のとおりです。

foo.o : foo.C foo.h
    $(CC) $(CFLAGS) -c foo.C

「foo」を適切なファイル名に置き換えて、各 .C ファイルにこれらの規則の 1 つを追加できます。このようにすれば、$(OBJECTS): $(HFILES)線は必要ありません。

于 2013-05-30T21:58:02.733 に答える
1

.o (オブジェクト コード) ファイルを生成するための "方法" は、ソース ファイルをコンパイルすることです。

何が起こっているのかを理解するために、これを読むことをお勧めします。

于 2013-05-30T21:44:55.180 に答える