簡體   English   中英

C ++編譯錯誤:找不到.o文件

[英]C++ compilation error: .o file not found

我正在嘗試使用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

嘗試在您的Makefile中添加幾行,例如:

.SUFFIXES: .C

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

大多數Make都有類似的內置內容(這可能就是為什么它不存在於您獲得的makefile中的原因),但顯然您沒有。 它可能僅識別C ++的其他擴展名,例如.cpp.c++

您可以通過刪除或注釋掉makefile的最后兩行來檢查“ make”是否知道如何從.C文件創建.o文件。

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

這些行將.h文件列出為.o文件的前提條件,因此make似乎可以找到.h文件並假定.o文件可以使用。 如果“ make”沒有用於生成.o文件的隱式規則,則可以按照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)行。

生成.o(目標代碼)文件的“方式”是編譯源文件。

您可能需要閱讀本文,以了解發生了什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM