2013-06-05 32 views
0

在我的Makefile中我試圖指定,我想將編譯後的可執行文件保存到/dvoram64/文件夾。以前,當我試圖挽救它直接寫給/一切工作都行,但現在我打電話make run後得到這個消息:將編譯後的文件放到文件夾後無法運行程序

[email protected]:~/Project$ make run 
Makefile:37: warning: overriding commands for target `dvoram64/main' 
Makefile:34: warning: ignoring old commands for target `dvoram64/main' 
make: Circular dvoram64/main <- dvoram64/main dependency dropped. 
mkdir -p dvoram64 
g++ -Wall -pedantic -Wno-long-long -O0 -ggdb -g -c src/main.cpp -o dvoram64/main 
./dvoram64/main 
make: execvp: ./dvoram64/main: Permission denied 
make: *** [run] Error 127 

Makefile看起來是這樣的:

#macros 
CC=g++ 
CCFLAGS=-Wall -pedantic -Wno-long-long -O0 -ggdb -g 
LBFLAGS=-lncurses -pthread 
Remove=rm -rf 
Objects=dvoram64/main 
Doxygen=Doxyfile 
RUN=./dvoram64/main 
CPATH=objects/ 

#generates final binary and documentation 
all: $(Objects) $(Doxygen) 
    make compile 
    make doc 

#build into final binary 
compile: $(RUN) 

#run program 
run: $(RUN) 
    $(RUN) 

clean: 
    $(Remove) doc/ 
    $(Remove) dvoram64 

#generate documentation in '<login>/doc' folder 
doc: $(Doxygen) src/* 
    (cd src | doxygen $(Doxygen)) 

#rules to make objects ---------------------------------------------------------------------------------- 
$(RUN): $(Objects) 
    $(CC) $(CCFLAGS) $(Objects) -o $(RUN) $(LBFLAGS) 

dvoram64/main: src/main.cpp 
    mkdir -p dvoram64 
    $(CC) $(CCFLAGS) -c src/main.cpp -o dvoram64/main 

有誰告訴我,導致這種情況的原因以及如何解決它?

+0

看看[這個鏈接](http://stackoverflow.com/questions/9106536/why-do-i-get-permission-denied-when-i-try-use-make-to-install-something) ,也[這一個](http://stackoverflow.com/questions/665180/why-is-make-complaining-about-circular-dependencies) –

+0

不幸的是,我不能使用任何makefile生成器... – Dworza

回答

2

你有幾個問題。首先:

RUN=./dvoram64/main 

$(RUN): $(Objects) 
    $(CC) $(CCFLAGS) $(Objects) -o $(RUN) $(LBFLAGS) 

dvoram64/main: src/main.cpp 
    mkdir -p dvoram64 
    $(CC) $(CCFLAGS) -c src/main.cpp -o dvoram64/main 

對於同一個目標(dvoram64/main),您有兩個規則。你想用哪個?你爲什麼有兩個?刪除其中一個。

下一頁:

Objects=dvoram64/main 

RUN=./dvoram64/main 

$(RUN): $(Objects) 
    ... 

您有(基本上)同樣的事情,這是凌亂的,但不違法的兩個變量。但是你讓另一個的先決條件成爲一個。一件事情不可能是它自己的先決條件,Make必須糾正你的錯誤。你應該重新考慮這一點。

下一頁:

RUN=./dvoram64/main 

run: $(RUN) 
    $(RUN) 

dvoram64/main: src/main.cpp 
    mkdir -p dvoram64 
    $(CC) $(CCFLAGS) -c src/main.cpp -o dvoram64/main 

你已經忘記了dvoram64/main是否應該在目標文件或可執行文件。你有兩條規則來建立它;一個構建一個可執行文件,另一個構建一個對象。您將其命名爲main,這聽起來像一個可執行文件,但您將該名稱放入名爲Objects的變量中。最後你建立一個目標文件並嘗試執行它。

通過保持makefile儘可能沒有冗餘,您可以節省一些麻煩。而當大目標失敗時,一次只嘗試一個小目標來縮小問題的範圍。

+0

TY爲答案...很好地解釋 – Dworza

相關問題