我有一个程序: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?
答案 0 :(得分:1)
文件foo
是从foo.cpp
生成的 目标文件 。目标文件当然不能执行,因为它们不是完整的程序。
由于您没有为可执行文件指定特定名称,因此POSIX环境(如Linux)上的默认值为a.out
。
如果您需要特定的文件名,则需要添加命令来创建它。并确保它不会与现有的目标文件发生冲突。
我建议您将整个Makefile
更改为更简单的内容,例如:
all: foo
foo: foo.o bar.o
$(CXX) foo.o bar.o -o foo
这就是所需要的一切。将使用隐式规则创建目标文件,具有正确的名称。