[英]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.