0

在我Makefile试图指定,我想将编译的可执行文件保存到/dvoram64/文件夹中。以前,当我试图将它直接保存到/一切正常时,但现在我在调用后收到此消息make run

ubuntu@pa2:~/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

谁能告诉我,是什么原因造成的以及如何解决?

4

1 回答 1

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 尽可能避免冗余来为自己省去一些麻烦。当大目标失败时,一次尝试一个小目标,以缩小问题的范围。

于 2013-06-05T03:03:07.080 回答