簡體   English   中英

Makefile 中的隱式規則中的 -c 標志錯誤

[英]Error with -c flag in implicit rule in Makefile

我正在學習 makefile 並且我正在嘗試通過使用隱式規則來減少我的 makefile。 到目前為止,這就是我所擁有的:

CC = /usr/bin/g++
OBJECTS_INTERACTIVE = calcular.o calc_interactive.o
    
calc_interactive: $(OBJECTS_INTERACTIVE)
    $(CC) $(OBJECTS_INTERACTIVE) -o $@              

calcular.o: calcular.c calcular.h
    $(CC) -c calcular.c

calc_interactive.o: calcular.h calc_interactive.c
    $(CC) -c calc_interactive.c

如果我這樣運行它,沒有錯誤。 但是,我想使用像 calcular.o calcular.o: calcular.h calcular.h 這樣的隱式規則,AFAIK 正在執行g++ -c calcular.c引擎蓋下,但顯然它正在執行該命令而沒有-c標志,我認為它關鍵,我沒有設法讓 g++ 在使用隱式規則時使用-c標志。 這就是我想要實現的目標:

CC = /usr/bin/g++
OBJECTS_INTERACTIVE = calcular.o calc_interactive.o

calc_interactive: $(OBJECTS_INTERACTIVE)
    $(CC) $(OBJECTS_INTERACTIVE) -o $@  

calcular.o: calcular.h

calc_interactive.o: calcular.h 
    

它產生此錯誤:

jules@desktop:$ make
/usr/bin/g++ -c calc_interactive.c
/usr/bin/g++ calcular.o calc_interactive.o -o calc_interactive
g++: error: calcular.o: No such file or directory 
makefile:11: recipe for target 'calc_interactive' failed 
make: *** [calc_interactive] Error 1 

編輯:所有文件https://pastebin.com/FZy5kqzj的詳細 pastebin

首先,不要使用 C++ 編譯器編譯 C 源代碼,除非您確定它是嚴格使用這兩種語言的公共子集編寫的。 C 和 C++ 各有對方所缺乏的功能,可以編寫符合兩種語言但對各自含義不同的代碼。 除非您有意識且消息靈通地努力編寫雙語言代碼,否則請為 C 代碼使用 C 編譯器。

其次,如果make ,使用這個 makefile:

 CC = /usr/bin/g++ OBJECTS_INTERACTIVE = calcular.o calc_interactive.o calc_interactive: $(OBJECTS_INTERACTIVE) $(CC) $(OBJECTS_INTERACTIVE) -o $@ calcular.o: calcular.h calc_interactive.o: calcular.h

產生您聲稱的 output :

 jules@desktop:$ make /usr/bin/g++ -c calc_interactive.c /usr/bin/g++ calcular.o calc_interactive.o -o calc_interactive g++: error: calcular.o: No such file or directory makefile:11: recipe for target 'calc_interactive' failed make: *** [calc_interactive] Error 1

那么最可能的結論是calcular.o不存在,並且不存在make知道如何構建它的源文件。 特別是,沒有calcular.c 這意味着原來的 makefile 也不應該再工作了。 也許您不小心刪除了源文件,或者在文件名或 makefile 或類似內容中引入了拼寫錯誤。

我想還有一個外部機會g++的錯誤消息具有誤導性。 如果calcular.o已經存在並且是最新的,但它的訪問控制屬性阻止您打開它進行讀取,則make不會嘗試重建它,但g++可能會發出誤導性診斷,其中“沒有這樣的文件或目錄" 真正的意思是“我無法打開這樣的文件”。 在這種情況下,刪除calcular.o以使make需要重建它,這可能是最干凈的解決方案。

暫無
暫無

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

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