【问题标题】:Cannot execute output files( able to execute a.out but not when I make an output file with "make")无法执行输出文件(能够执行 a.out 但当我使用“make”制作输出文件时无法执行)
【发布时间】:2018-02-11 18:58: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: Permission denied

但是,如果我先执行 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?

【问题讨论】:

  • 为什么要将 CC 重新定义为 g++?你已经有 CXX 了。但真正的问题是你的目标是错误的。
  • 要运行这样的文件,需要将其标记为 executable (chmod +x)。
  • @KlaasvanGend 我已经读过,为您使用的编译器执行 CC 是惯例,我也是初学者,所以不太了解,您能澄清一下目标是什么意思是错误的?
  • @JesperJuhl 是的,我已经这样做了,然后它会给出以下错误:无法执行二进制文件:执行格式错误
  • CC 表示 C 编译器。您需要一个C++ 编译器。见manual

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


【解决方案1】:

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

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

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


我建议您将整个 Makefile 更改为更简单的东西,如下所示:

all: foo

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

这就是我们所需要的。将根据隐式规则创建对象文件,具有正确的名称

【讨论】:

  • foo 是一个目标文件吗?我写了 g++ foo.cpp -o foo 然后执行 ./foo(it works) 不是 makefile 的工作是在终端上写这些指令吗?我写了同样的说明
  • @rtanmay 再看看你的Makefile。您不要创建可执行的foo 文件,因为您使用CFLAGS 中的-c 选项。此外,当运行make 时,它将完全按照执行它们的方式打印出所有命令,以及所有参数。在那里你应该清楚地看到g++ -c foo.cpp -o foo。再次注意-c 标志。
  • 好的,非常感谢。我不知道链接器。所以,我刚刚删除了 -c 标志,现在它可以工作了。但这是否被认为是一种好的做法(我的意思是让编译器进行链接)?
  • @rtanmay 那么你有两个程序吗?那是分开的?那么它们不应该链接在一起,所以无视我的Makefile。至于链接,即使你这样做,例如g++ foo.cpp -o foo仍然链接。程序g++ 是一个前端程序,它在内部调用实际的编译器和链接器。
  • 非常感谢,还有一个疑问,我是否应该在我的命令中包含 -c 标志。什么是好的做法?我对此很陌生,所以请原谅我的无知另外,我不知道为什么,但我无法使用@符号在 cmets 中标记您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2020-03-18
  • 2014-09-27
相关资源
最近更新 更多