【问题标题】:Can't run program after putting the compiled file to the folder将编译好的文件放入文件夹后无法运行程序
【发布时间】:2025-12-09 12:05:02
【问题描述】:

在我的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

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

【问题讨论】:

  • 查看this link,也可以查看this one
  • 不幸的是我不能使用任何 makefile 生成器...

标签: c++ makefile


【解决方案1】:

你有几个问题。第一:

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

【讨论】:

  • TY 回答...很好解释