【问题标题】:makefile executable permission deniedmakefile 可执行权限被拒绝
【发布时间】:2015-02-08 20:33:44
【问题描述】:

我有一个生成文件,它创建一个可执行文件(“ls”)并将它放在一个名为 bin 的文件夹中。但是,当我之后尝试运行该可执行文件时,出现错误: "-bash: bin/ls: 权限被拒绝"

VPATH = src
CC = g++
CFLAGS =-c -Wall -Werror -ansi -pedantic

all:    clean rshell

rshell: ls.cpp
        $ mkdir -p ./bin
        $ $(CC) $(CFLAGS) src/ls.cpp -o bin/ls
clean:
        rm -rf bin

【问题讨论】:

    标签: build permissions makefile


    【解决方案1】:

    问题准确地说明了问题所在:您新创建的ls 可执行文件缺少可执行位。

    在您的情况下,您明确禁用链接器,这几乎不是一个好方法,除非您真的真的很清楚自己在做什么。我的盲目猜测是您的源代码缺少int main(int, char**) 函数,因此链接会给您一个错误(因为您无法使用没有main 的标准链接器设置构建可执行文件)。但是,在您的CFLAGS 中使用-c,您既不会收到警告,也不会收到可执行文件。

    编辑:file ls 会显示类似

    ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
    

    在使用-c 编译的二进制文件上,而完全成熟的可执行文件将具有

    ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=6cf260a90064be20cfa17ff5fefd7040254f79e1, not stripped
    

    注意一个文件是executable ;) 此外,它与 something 相关联,包括在ls 的main 函数之前执行的启动代码。没有它,操作系统将不知道如何运行您的程序。

    【讨论】:

    • 使用-c标志没有错;问题是把它放在CFLAGS 中。通常,您会使用-c -o file.o 生成目标文件,然后将这些目标文件链接在一起以生成可执行文件;这对于大型项目很有用,您不想每次对其中一个文件进行一些更改时都重新编译所有文件。 gcc 只对可执行文件设置x 权限; -c 生成没有 x 权限的文件。 chmod +x 无济于事,因为这些文件也不是可执行映像,但是当您尝试运行该文件时会产生不同的错误。
    • @rici 完全正确!感谢您的详细说明。
    猜你喜欢
    • 2016-04-15
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多