无法执行输出文件(能够执行a.out但不能在使用“make”创建输出文件时)

时间:2018-02-11 18:58:15

标签: c++ bash makefile output c++14

问题已 已解决 ,请访问本段底部了解详情。

我有一个程序:foo.cpp和bar.cpp,并创建了一个Makefile来编译它们。

这就是它(Makefile)的样子:

CC=g++
CFLAGS=-c

foo.o: foo.cpp
    $(CC) $(CFLAGS) foo.cpp -o foo 

all: foo.o bar.o 

bar.o: bar.cpp
    $(CC) $(CFLAGS) bar.cpp -o bar

现在,当我运行make all,它编译并且我有输出文件但是当我运行./foo时它给了我这个错误 - > bash:./ foo:权限被拒绝

但是,如果我执行g ++ foo.cpp然后执行./a.out则运行。

我见过类似的问题:https://askubuntu.com/questions/466605/cannot-open-output-file-permission-denied并尝试了解决方案,但它没有用。

我不明白为什么会这样。有人可以帮忙(我是Makefiles的新手)吗?

由于

对于未来的访客

解决方案和错误:

1)使用-c flag,它创建了一个输出文件而不是我试图执行的可执行文件。

2)有关更多信息,请参阅链接器的答案:What's an object file in C?

1 个答案:

答案 0 :(得分:1)

文件foo是从foo.cpp生成的 目标文件 。目标文件当然不能执行,因为它们不是完整的程序。

由于您没有为可执行文件指定特定名称,因此POSIX环境(如Linux)上的默认值为a.out

如果您需要特定的文件名,则需要添加命令来创建它。并确保它不会与现有的目标文件发生冲突。

我建议您将整个Makefile更改为更简单的内容,例如:

all: foo

foo: foo.o bar.o
    $(CXX) foo.o bar.o -o foo

这就是所需要的一切。将使用隐式规则创建目标文件,具有正确的名称