无法执行Makefile生成的输出文件,但a.out可正常运行的问题
解决Makefile编译后可执行文件权限被拒绝的问题
嘿,咱们来搞定这个权限问题!你遇到的情况挺典型的——用Makefile编译出的./foo跑不了,报Permission denied,但直接用g++ foo.cpp生成的a.out却能正常运行,大概率是你的Makefile规则出了问题,或者生成的文件压根不是可执行格式。
我给你梳理几个排查和解决的步骤:
先检查你的Makefile规则
最常见的坑就是编译时误用了-c选项。g++ -c只会把源文件编译成目标文件(.o),而不是完整的可执行程序。如果你的Makefile里写了类似下面的规则:foo: foo.cpp g++ -c foo.cpp -o foo那生成的
foo其实是个目标文件,不是可执行程序,自然没有执行权限,运行就会报错。正确的规则应该去掉-c,让g++完成编译+链接的完整流程:foo: foo.cpp g++ foo.cpp -o foo bar: bar.cpp g++ bar.cpp -o bar all: foo bar手动修复权限(临时应急)
如果确认生成的foo是可执行程序但没权限,可以先手动给它加上执行权限:chmod +x foo不过这只是临时办法,得从Makefile上解决根本问题,不然下次
make all又会生成权限不对的文件。排除文件系统挂载问题
这个概率比较小,但如果你的工作目录所在的分区是用noexec选项挂载的,那即使文件有执行权限也跑不了。不过你直接生成的a.out能正常运行,说明这个可能性很低,可以不用纠结。
按照上面的步骤排查,基本就能解决问题啦!
内容的提问来源于stack exchange,提问作者rtanmay
相关产品推荐
相关产品推荐

