精华内容
下载资源
问答
  • 可执行文件
    千次阅读
    2021-05-10 02:46:58

    使文件可以直接执行的命令:chmod +x filename

    使所有用户对目录都有读写权限:sudo chmod ugo+rw /opt

    命令描述

    变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取,写入,执行3种一般权限来区分,另有3种特殊权限可供运用,再搭配拥有者与所属群组管理权限范围。您可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果您对符号连接修改权限,其改变会作用在被连接的原始文件。权限范围的表示法如下:

    u:User,即文件或目录的拥有者。

    g:Group,即文件或目录的所属群组。

    o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。

    a:All,即全部的用户,包含拥有者,所属群组以及其他用户。

    有关权限代号的部分,列表于下:

    r:读取权限,数字代号为"4"。

    w:写入权限,数字代号为"2"。

    x:执行或切换权限,数字代号为"1"。

    -:不具任何权限,数字代号为"0"。

    s:特殊?b>功能说明:变更文件或目录的权限。

    语法

    chmod [-cfRv][--help][--version][+/-/=][文件或目录...]

    chmod [-cfRv][--help][--version][数字代号][文件或目录...]

    chmod [-cfRv][--help][--reference=][--version][文件或目录...]

    选项说明

    -c或--changes 效果类似"-v"参数,但仅回报更改的部分。

    -f或--quiet或--silent 不显示错误信息。

    -R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。

    -v或--verbose 显示指令执行过程。

    --help 在线帮助。

    --reference= 把指定文件或目录的权限全部设成和参考文件或目录的权限相同

    --version 显示版本信息。

    + 开启权限范围的文件或目录的该项权限设置。

    - 关闭权限范围的文件或目录的该项权限设置。

    = 指定权限范围的文件或目录的该项权限设置。

    范例

    范例一 :将档案 file1.txt 设为所有人皆可读取 :

    chmod ugo+r file1.txt

    将档案 file1.txt 设为所有人皆可读取 :

    chmod a+r file1.txt

    将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :

    chmod ug+w,o-w file1.txt file2.txt

    将 ex1.设定为只有该档案拥有者可以执行 :

    chmod u+x ex1

    将目前目录下的所有档案与子目录皆设为任何人可读取 :

    chmod -R a+r *

    当其他用户执行oracle的sqlplus这个程序时,他的身份因这个程序暂时变成oracle

    chmod u+s sqlplus

    此外,chmod也可以用数字来表示权限如 chmod 777 file

    语法为:chmod abc file

    其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

    r=4,w=2,x=1

    若要rwx属性则4+2+1=7;

    若要rw-属性则4+2=6;

    若要r-x属性则4+1=5。

    范例二:

    chmod a=rwx file

    chmod 777 file

    效果相同

    chmod ug=rwx,o=x file

    chmod 771 file

    效果相同

    若用chmod 4755 filename可使此程式具有root的权限

    范例三:

    如果在cd /media/amasun/java/develop/array之后执行

    chmod 777 ./

    是将本目录(即/media/amasun/java/develop/array)设为任何人可读,写,执行

    如果是

    管理员也就是常说的ROOT用户的话,基本上有可以查看所有文件的权力.

    更多相关内容
  • Linux中的二进制可执行文件和脚本可执行文件及Shebang 二进制可执行文件 我们知道,一个C程序经过预处理、编译、汇编、链接就会得到一个二进制可执行文件,这种文件在Linux中叫做ELF文件。比如我们有一个C源代码...

    Linux中的二进制可执行文件和脚本可执行文件及Shebang

    二进制可执行文件

    我们知道,一个C程序经过预处理、编译、汇编、链接就会得到一个二进制可执行文件,这种文件在Linux中叫做ELF文件。比如我们有一个C源代码hello.c

    #include <stdio.h>
    
    int main(int argc, char** argv){
      	printf("Hello !\n");
    }
    

    我们编译得到 hello 文件,并用file命令可以查看到生成的二进制可执行文件的信息:

    gcc hello.c -o hello
    file hello
    # 输出:
    # hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=cf2738fd1715f096d4b0e0e4b264146b78b454b1, not strippe
    

    确实是ELF文件,我们可以直接执行它:

    ./hello
    # 输出:
    # Hello
    

    这是我们常见的,可以理解的,链接后的可执行文件就是可以直接运行,就像我们在Windows上双击打开一个exe文件那样自然。那么,脚本可执行文件又是怎么一回事呢?

    脚本可执行文件及Shebang

    脚本可执行文件也可以像运行二进制可执行文件那样来直接运行它。我们知道shell、python等属于脚本语言。令我们好奇的是,脚本程序如 train.py 等看上去只是一个文本文件,为什么也能直接被执行呢 ?

    我们知道,想要运行一个脚本文件,我们需要指定一个解释器。通常,我们有两种方式来指定脚本文件的解释器:

    1. 在命令行中指定,如bash run.shpython train.py等。
    2. 通过文件中的第一行Shebang指定。在脚本文件的头上,通常会有一行Shebang:#!。比如:#!/bin/bash#!/home/song/bin/python等。

    Shebang通常出现在类Unix系统的脚本中第一行,作为前两个字符。在Shebang之后,可以有一个或数个空白字符,后接解释器的绝对路径用于指明执行这个脚本文件的解释器。在直接调用脚本时,系统的程序载入器会分析 Shebang 后的内容,将这些内容作为解释器指令,并调用该指令,将载有 Shebang 的文件路径作为该解释器的参数,执行脚本,从而使得脚本文件的调用方式与普通的可执行文件类似。例如,以指令#!/bin/sh开头的文件,在执行时会实际调用 /bin/sh 程序(通常是 Bourne shell 或兼容的 shell,例如 bash、dash 等)来执行。

    由于 # 符号在许多脚本语言中都是注释标识符,这既是偶然,也是必然。Shebang 的内容会被这些脚本解释器自动忽略。 在 # 字符不是注释标识符的语言中,例如 Scheme,解释器也可能忽略以 #! 开头的首行内容,以提供与 Shebang 的兼容性。

    实际上,#!两个字符的ASCII码是两个magic字符,当类UNIX操作系统看到一个文件以这两个字符开头,会将这个文件当做是可执行文件,并且按照其后的解释器来执行它(需要有执行权限)。这时,操作系统实际上加载的是 #! 后面跟的那个二进制文件(即解释器),然后将脚本文件的文本内容作为参数传给这个二进制文件。这一点可以通过观察脚本可执行文件运行使得strace结果中的execve来验证。

    Shebang的一些具体用法和注意事项:

    1. 如果脚本文件中没有#!这一行,那么执行时会默认采用当前Shell去解释这个脚本(即:SHELL环境变量)。
    2. 如果#!之后的解释程序是一个可执行文件,那么执行这个脚本时,它就会把文件名及其参数一起作为参数传给那个解释程序去执行。
    3. 如果#!指定的解释程序没有可执行权限,则会报错 bad interpreter: Permission denied。如果#!指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的SHELL去执行这个脚本。
    4. 如果#!指定的解释程序不存在,那么会报错 bad interpreter: No such file or directory。注意:#!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会自动到环境变量PATH中寻找解释器的。要用绝对路径是因为它会调用系统调用execve,这可以用strace工具来查看。
    5. 脚本文件必须拥有可执行权限。可通过chmod +x [filename] 来添加可执行权限。
    6. 当然,如果你使用类似于 bash test.shpython train.py这样的命令来执行脚本,那么#!这一行将会被忽略掉,解释器当然是用命令行中显式指定的解释器。

    我们来试一下,先创建一个py文件world.py,并直接写入为:

    print('World !')
    

    我们可以通过在命令行指定python解释器来运行,就像我们一直做的那样:

    python world.py
    # 输出:
    # World !
    

    但是,当我们想像运行二进制可执行文件那样来运行它

    ./world.py
    # 输出:
    # -bash: ./world.py: Permission denied
    

    首先会受到一条没有执行权限的命令,如上。这很正常,因为我们创建的时候它是一个文本文件嘛。我们通过 chmod 来使得它可执行,并再次尝试运行它:

    chmod +x world.py
    ./world.py
    # 输出:
    # ./world.py: line 1: syntax error near unexpected token `'World !''
    # ./world.py: line 1: `print('World !')'
    

    问题出现了,和我们之前讨论的一样,由于我们没有通过Shebang来指定脚本的解释器,系统默认用了Shell来解释,那我们的python语法自然是不对的。那这时,想要像运行二进制可执行文件那样去运行它,必须请出我们的Shebang来帮忙在文件内指明解释器的绝对路径。更改world.py 为:

    #!/home/song/anaconda3/envs/JJ_env/bin/python
    print("World")
    

    这时我们再来运行:

    ./world.py
    # 输出:
    # World !
    

    就可以了。我们还可以通过 file 命令再来看一下 world.py 的文件信息:

    file world.py
    # 输出:
    # world.py: a /home/song/anaconda3/envs/JJ_env/bin/python script, ASCII text executable
    

    我们看到该文件是一个ASCII text executable,即 ”文本可执行文件“。不同于ELF二进制可执行文件,但也是可执行文件。也就是说,在Linux的世界中,可执行文件不只有ELF一种。

    另外,由于Linux系统对后缀名并不严格要求,我们可以直接将world.py改为world,这样也是可以的,然后就可以通过将world这个脚本可执行文件放到PATH环境变量下,从而将world直接作为一个命令来使用啦!具体可参考笔者另一篇介绍Linux常用环境变量的博客。

    总结

    总结一下:Linux中除了ELF二进制可执行文件之外,还有脚本可执行文件,要想让脚本可执行文件直接像二进制可执行文件一样运行,而不需在命令行中指定解释器,需要在脚本文件头通过Shebang !#来指定解释器的绝对路径。Shebang的一些具体的注意事项在上文中已经指出。另外,通过将可执行文件(二进制、脚本都可)添加到PATH环境变量的可执行文件搜索目录下,可将在命令行中通过命令来直接使用这些可执行文件。

    Ref:

    https://blog.csdn.net/u012294618/article/details/78427864

    展开全文
  • C语言 目标文件和可执行文件(ELF文件)

    万次阅读 多人点赞 2019-05-15 18:55:15
    1.C语言创建程序 1.1C语言创建(分为4个步骤) 编辑 ...编译器的输出结果成为目标代码,存放它们的文件称为目标文件。扩展名为.o或者.obj。 (该部分编译是指汇编器编译汇编语言或者编译器编译...

    转自:https://www.jianshu.com/p/7c609b70acbd

    1.C语言创建程序

    1.1C语言创建(分为4个步骤)
    • 编辑
    • 编译
    • 链接
    • 执行

    编辑:就是创建和修改C程序的源代码-我们编写的程序称为源代码。
    编译:就是将源代码转换为机器语言。编译器的输出结果成为目标代码,存放它们的文件称为目标文件。扩展名为.o或者.obj。
    (该部分编译是指汇编器编译汇编语言或者编译器编译高级语言)
    链接:链接器将源代码由编译器产生的各种模块组合起来,再从C语言提供的程序库中添加必要的代码模块,将它们组成一个可执行的文件。在windows下扩展名为.exe,Unix下无扩展名。
    执行:运行程序。

    C.png
    1.2什么是源代码,目标文件,可执行文件。

    源代码 ——源文件就是存放程序代码的文件。通常我们编辑代码的文件就是源文件。

    • 源代码相对目标代码和可执行代码而言的。
    • 源代码就是用汇编语言和高级语言写出来的地代码。

    目标文件——指源代码经过编译程序产生的能被cpu直接识别二进制代码。

    • 目标代码指计算机科学中编译器或汇编器处理源代码后所生成的代码,它一般由机器代码或接近于机器语言的代码组成。
    • 目标文件包括着机器代码(可直接被计算机中央处理器履行)和代码在运行时使用的数据,如重定位信息,如用于链接或调试的程序符号(变量和函数的名字),另外还包括其他调试信息。
    gcc -c main.c 
    编译main.c ,生成目标文件main.o,但不进行link. 
    gcc -o main.o
    链接成可执行文件main

    可执行文件——可执行代码就是将目标代码连接后形成的可执行文件,当然也是二进制的。 连接程序系统库文件连接就生成可执行文件。

    例如:*.obj是程序编译之后生成的目标文件,连接程序再将这个文件与系统库文件连接就生成可执行文件
    
    1.3链接器的作用
    Screen Shot 2017-06-12 at 4.32.06 PM.png

    根据上面的图,我们可以看到链接器还额外链接了2个部分。

    目标代码文件中所缺少的第一个元素是一种叫做启动代码(Start-up code)的东西,此代码相当于您的程序和操作系统之间的接口。例如你可以在dos 或Linux下运行一个 IBM PC 兼容机,在两种情况中硬件是相同的,所以都会使用同样的目标代码,但是 DOS与Linux要使用不用的启动代码,因为这两种系统处理程序的方式不同的。

    所缺少的第二个元素是库例程的代码。几乎所有C程序都利用标准库中所包含的例程(称为函数)。例如,程序中的函数printf()。目标代码文件不包含这一函数的指令。实际代码存储在另一个称为“库”的文件中,库文件中包含许多函数的目标代码。

    链接器的作用是将这3个元素(目标代码、系统的标准启动代码和库代码)结合在一起,并将他们存放在单个文件,即可执行文件中。对库代码来说,链接器只从库中提取您所使用的函数所需的代码。

    可以得出结论:目标文件和可执行文件都是由机器语言指令组成的。但目标文件只包含您所编写的代码转换成的机器语言,而可执行文件还包含您所使用的库例程以及启动代码。

    下面这幅图能大致说明一下链接的情况。


    1.png

    这是一个main.o目标代码,内部有main,foo,bar三个函数。

    U main表示main这个符号在crtl1.o中用到了,但是没有定义。因此需要main.o提供定义并和crtl1.o链接在一起。main整个程序的入口实际上是_crtl1.o中的 _start,它做了一些初始化工作(启动历程),然后调用C代码中提供的main.c函数。libc是运行时候动态链接libc共享库(库中包含常用的函数)。

    所以程序的入口点其实是_start,main函数实际上是被_start调用。

    1.4gcc命令图
    QQ截图20170613151139.png

    2.ELF文件(该部分分析目标文件和可执行文件的,涉及部分汇编指令)

    ELF文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,它有三种不同的类型:

    • 可重定位的目标文件
    • 可执行文件
    • 共享库

    ELF文件格式提供了两种不同的视角,在汇编器和链接器看来,ELF文件是由Section HeaderTable描述的一系列Section的集合,而执行一个ELF文件时,在加载器(Loader)看来它是 由Program Header Table描述的一系列Segment的集合。如下图所示。


    Screen Shot 2017-06-10 at 10.01.54 PM.png

    左边是从汇编器和链接器的视角来看这个文件,开头的ELF Header描述了体系结构和操作系统 等基本信息,并指出Section Header Table和Program Header Table在文件中的什么位 置,Program Header Table在汇编和链接过程中没有用到,所以是可有可无的,Section Header Table中保存了所有Section的描述信息。右边是从加载器的视角来看这个文件,开头 是ELF Header,Program Header Table中保存了所有Segment的描述信息,Section Header Table在加载过程中没有用到,所以是可有可无的。注意Section Header Table和ProgramHeader Table并不是一定要位于文件开头和结尾的,其位置由ELF Header指出,上图这么画只是为了清晰。

    目标文件需要链接器做进一步处理,所以一定有Section Header Table;可执行文件需要加载运行,所以一定有Program Header Table;而共享库既要加载运行,又要在加载时做动态链接, 所以既有Section Header Table又有Program Header Table。

    • section:C语言内存中的.text,.data,.bss.....
    • Segment:是指在程序运行时加载到内存的具有相同属性的区域,由一个或多个Section组成,比如有两个Section都要求加载到内存后可读可写,就属于同一个Segment。有些Section只对汇编器和链接器有意义,在运行时用不到,也不需要加载到内 存,那么就不属于任何Segment 。

    2.1重定位目标文件

    在进行该部分之前,我们先查看一下网上的部分重定位目标文件的资料。

    资料一:

    汇编器所产生的目标文件至少包括三个区,即文本区(text),数据区(data)和bss区。文本区一般包括程序的代码和常量,数据区通常存放全局变量等内容,bss区用于存放未初始化的变量或作为公共变量存储空间。在一个目标文件中,其text区从地址0开始,随后是data区,再后面是bss区。而要运行程序,必须装载到内存中,所以这些区的地址需要在内存中重新安排,也就是重定位。

    资料二:

    编译器编译后产生的目标文件是可重定位的程序模块,并不能直接运行,链接就是把目标文件和其他分别进行编译生成的程序模块(如果有的话)及系统提供的标准库函数连接在一起,生成可运行的可执行文件的过程。
    重定位是链接器在完成符号解析后(知道了各个输入模块的代码段和数据段的大小)的一个步骤,其作用顾名思义就是重新定位,确定比如指令,全局变量等在运行时的存储器地址。

    资料三:

    比如说两个编译后的可重定位目标文件obj1.o和obj2.o
    在obj1.o里面定义了一个全局变量glob(在obj1里面记录了glob相对于该文件数据段的相对地址), 而obj2.0里面又引用了这个全局变量glob。
    链接的重定位就是要确定在链接后的可执行程序中glob的地址,而不是相对于obj1的地址,从而使obj2也能通过地址调用glob。
    当然重定位并不只是全局变量,还包括外部函数,指令等运行时地址的确定

    资料四:

    当你在程序中写上一个全局变量或者是一个函数时,这个定位过程会经历几个阶段:
    1.在这个目标文件中的相对定位,一个目标文件中对此文件中的所有函数,变量进行符号描述,比如一个变量A,它所占的相对地址是多少?是全局的?或者是静态的,或者是外部的??
    2.在连接多个目标成一个可执行文件时,会再次对这个变量进行重定位,也就是在这个可执行文件中进行对此变量进行描述,同目标文件中的描述差不多,只不过此变量不再有外部,内部之分,都成了本地变量,并且会将所有全局变量存放在一定的逻辑地址中,这是通过连接脚本文件与各个目标文件中的相对地址共同决定的
    3.最终的操作系统加载这个可执行文件时,会对这些变量与函数地址再次进行重定位,其方式就是首先分析这个可执行文件中的不同段,读出相应的描述表,然后通过逻辑地址与物理地址进行映射出,最终就将可执行的二进制码加进了真实的物理内存了,关于分析可执行文件格式与物理地址的转换,不同的CPU与操作系统的实现方式会有不同之处

    接下来我们开始实践部分,首先写一个求一组数的最大值的汇编程序max.s。

    Screen Shot 2017-06-11 at 3.42.29 PM.png

    现在有一个max.o目标文件,我们用readlf工具读取其ELF Header和Section Header Table


    Screen Shot 2017-06-10 at 10.20.59 PM.png

    ELF Header中描述了操作系统是UNIX,体系结构是80386。Section Header Table中有8个Section Header,从文件地址200
    (0xc8)开始,每个Section Header占40字节,共320字节,到文件地址0x207结束。这个目标文件没有Program Header。文件地址是这样定义的:文件开头第一个字节的地址是0,然后每个字节占一个地址。

    QQ图片20170611130217.png

    从Section Header中读出各Section的描述信息。
    Addr是这些段加载到内存中的地址(程序中的地址都是虚拟地址),加载地址要在链接时填写,现在空缺,所以是全0。
    OffSize两列指出了各Section的文件地址,比如.data段从文件地址0x60开始,一共0x38个字节,回去翻一下程序,.data段定义了14个4字节的整数,一共是56个字节,也就是0x38。

    根据以上信息可以描绘出整个目标文件的布局。

    QQ图片20170611132839.png

    ** Section Header Table**:读出各Section的描述信息。
    .shstrtab:保存着各Section的名字,比如.text,.data.....。
    .strtab:保存着程序中用到的符号的名字.比如汇编程序的start_loop:和loop_exit符号。(对应的就是for循环)。
    **.data **:保存程序中已初始化的全局变量和静态变量以及字符串常量。
    .bss:存放程序中未初始化的全局变量和静态变量。
    .text:存放程序执行代码。
    .rel.text:告诉链接器指令中的哪些地方需要做重定位。
    下节分析。

    Screen Shot 2017-06-11 at 2.40.30 PM.png

    我们看一下.text段内容


    Screen Shot 2017-06-11 at 3.44.53 PM.png

    ![Uploading QQ截图20170613113520_952796.png . . .]

    text段代码中,一些跳转指令和内存访问指令中的地址都是符号的相对地址,下一步链接器要修改这些指令,把其中的地址都改成加载时的内存地址,这些指令才能正确执行。

    2.2可执行文件

    现在分析可执行文件max。


    Screen Shot 2017-06-11 at 2.45.59 PM.png
    Screen Shot 2017-06-11 at 2.47.07 PM.png
    Screen Shot 2017-06-11 at 2.47.43 PM.png
    Screen Shot 2017-06-11 at 2.48.05 PM.png

    在ELF Header中,Type改成了EXEC,由目标文件变成可执行文件了多了两个Program Header,少了两个Section Header。

    在Section Header Table中,.text和.data的加载地址分别改成了0x0804 8074和0x0804 90a0。.bss段没有用到,所以被删掉了。.rel.text段就是用于链接过程的,链接完了就没用 了,所以也删掉了。

    多出来的Program Header Table描述了两个Segment的信息。.text段和前面的ELF Header、Program Header Table一起组成一个Segment(FileSiz指出总长度 是0x9e),.data段组成另一个Segment(总长度是0x38)。VirtAddr列指出第一 个Segment加载到虚拟地址0x0804 8000,第二个Segment加载到地址0x0804 90a0。Flg列指出第一个Segment的访问权限是可读 可执行,第二个Segment的访问权限是可读可写。

    Screen Shot 2017-06-11 at 2.54.13 PM.png

    原来目标文件符号表中的Value都是相对地址,现在都改成绝对地址了。

    我们查看一下.txt段内容。


    Screen Shot 2017-06-11 at 3.32.25 PM.png
    现在我们对比一下目标文件和可执行文件的不同。

    目标文件.text和.data段地址


    QQ截图20170613113520.png

    可执行文件.text和.data段地址


    QQ截图20170613113500.png

    目标文件中跳转指令


    Screen Shot 2017-06-11 at 3.35.56 PM.png

    可执行文件中跳转指令


    Screen Shot 2017-06-11 at 3.36.18 PM.png

    目标文件中内存访问指令


    Screen Shot 2017-06-11 at 3.37.08 PM.png

    可执行文件中内存访问指令


    • 可以看到指令中的相对地址都改成绝对地址了。
    • 结合上2部分分析,我们可以看到。
    • .text和.data段代码加载到内存中的地址由空缺0变成了具体地址。
    • .text段代码中一些跳转指令和内存访问指令中的地址由相对地址改成加载时的内存地址,
    • .data段代码也由相对地址改为绝对地址。

    3.静态库和共享库

    :有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库,我们在不同的程序中都会用到libc中的库函数(例如printf)。

    共享库和静态库的区别:在链接libc共享库时只是指定了动态链接器和该程序所需要的库文件,并没有真的做链接,可执行文件调用的libc库函数仍然是未定义符号,要在运行时做动态链接。而在链接静态库时,链接器会把静态库中的目标文件取出来和可执行文件真正链接在一起。

    • 静态库链接后,指令由相对地址变为绝对地址,各段的加载地址定死了。
    • 共享库链接后,指令仍是相对地址,共享库各段的加载地址并没有定死,可以加载到任意位置。

    静态库好处:静态库中存在很多部分,链接器可以从静态库中只取出需要的部分来做链接 (比如main.c需要stach.c其中的一个函数,而stach.c中有4个函数,则打包库后,只会链接用到那个函数)。另一个好处就是使用静态库只需写一个库文件名,而不需要写一长串目标文件名。

    该部分是参照《一站式学习C编程》所做的总结,理解程度比较初步。

    展开全文
  • python脚本文件编译成可执行文件(.exe文件) 在windows下编译 先决条件: 1、已经在windows/linux 下面安装了 python 2、打开win+R(CMD命令) 输入: pip intsall pyinstaller 3、保证安装成功以后,在需要安装...

    python脚本文件编译成可执行文件(.exe文件)

    在windows下编译
    先决条件:
    1、已经在windows/linux 下面安装了 python

    2、打开win+R(CMD命令)
    输入:

    pip install pyinstaller
    

    在这里插入图片描述
    3、保证安装成功以后,在需要安装的位置打开cmd窗口
    对需要编译成可执行文件的.py文件进行编译,在{注:选中当前文件夹,不要进入到文件夹}下打开cmd指令窗口。 win10按住:shift+鼠标右键 --》选中 (在此处打开power shell 窗口,就相当于打开了cmd命令行窗口)
    输入:

        pyinstaller -F -w hello.py
    # (-F表示打包单个文件,-w是为了打开exe时候不弹出黑框)
    

    在这里插入图片描述
    这样在文件夹下面就得到了.exe的可执行文件

    展开全文
  •  在Linux下,一般我们的.c等程序文件在经过编译后会生成可执行文件。在获得可执行文件后,第一印象就是调用可执行文件名来运行,但是在运行时就会发现Command not found的提示。使用“./可执行文件名”在命令行输入...
  • linux生成可执行文件的过程

    千次阅读 2022-03-14 10:30:59
    编译器:GCC 预处理:头函数的包含,去掉注释,宏展开 gcc -E helloworld.c -o helloworld.i; 编译:编译过程做语法检查,...链接:添加对应的操作系统链接库生产可执行文件。 gcc helloworld.o -o helloworld; ...
  • Python生成可执行文件.exe

    千次阅读 2022-04-04 15:41:15
    Python生成可执行文件.exe
  • Linux之执行一个可执行文件

    千次阅读 2021-07-19 18:21:45
    Linux中执行一个可执行文件: 在Linux系统中执行一个可执行文件,只需写正确文件路径,即可执行文件,不需要写命令。 1、 如果执行当前路径下的文件 ./文件名 2、 执行非当前目录下的文件: ./文件的绝对路径 注意...
  • 如何将python生成为可执行文件

    千次阅读 2021-12-22 11:10:15
    将python生成为可执行文件 2、在当前目录下输入 pyinstaller -F -w -i aaa.ico GBK.py pyinstaller:需要提前安装模块安装方法:pip install pyinstaller
  • go中生成可执行文件

    千次阅读 2020-11-01 12:03:02
    go中生成可执行文件 文章目录go中生成可执行文件一、简介二、使用三、示例3.1 带参数编译3.1.1 目标go文件3.2 多文件编译3.3 go项目编译四、其它4.1 go install4.2 go目录结构 一、简介 这里介绍对go项目进行打包...
  • QT生成可执行文件

    千次阅读 2021-01-18 16:27:25
    生成可执行文件 1、打开一个QT程序,以release方式运行一次 2、这时你的工程项目文件夹下,会生成一个关于release的文件夹 3、打开关于release相关的文件夹,找到该目录下release目录下的.exe程序。此时你点击是...
  • gcc编译c文件生成可执行文件

    千次阅读 2019-11-03 18:05:28
    假如要编译c文件test.c 首先编写test.c文件: caizd@ubuntu:~/czd$ vi test.c #include <stdio.h> int main(int argc, char** argv) { printf("Hello World!\n"); return 0; } 1、最简单的操作: gcc test...
  • 将Linux可执行文件变成可执行命令

    千次阅读 2019-01-22 14:16:47
    查看PATH环境变量 echo $PATH 或 env | grep PATH 添加路径到PATH export PATH=/usr/test:$PATH 临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢#复原有的path配置,通过...4.将可执行文件放入该...
  • gcc编译生成可执行文件的过程中发生了什么

    千次阅读 多人点赞 2019-04-15 11:46:05
    一直好奇程序的编译过程到底做了哪些工作,后来学会在Ubuntu上使用gcc编译程序,知道了生成可执行文件需要分为预编译、编译、汇编和链接4个步骤,逐渐了解了其中的细节,但是过一段时间之后总是记不太清楚了,所以...
  • 什么是可执行文件

    千次阅读 2020-08-27 18:08:47
    文章目录一、什么是可执行文件?二、如何识别PE文件? 一、什么是可执行文件可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。 可执行文件的格式: Windows平台: PE(Portable ...
  • 将python文件编译成可执行文件

    千次阅读 2020-09-02 22:44:38
    将python文件编译成exe文件需要第三方库:pyinstaller ,执行命令:pip3 install pyinstaller即可安装。 进入python文件路径下(不能含有中文),执行命令:pyinstaller -F 1.py 执行完命令后,会生成如下文件。在...
  • Linux下gcc编译c文件为可执行文件分为四个步骤: 分别是 预编译、编译、汇编、链接。 1、预编译( 生成 hello.i 文件) 预编译的处理规则: 1. 将所有的 “#define” 删除,并展开所有的宏定义。 2. 处理...
  • (2)编译代码成windows与linux两种环境下的可执行文件。 测试代码文件名为main.go,内容如下: package main import ( "fmt" "io/ioutil" "os" ) func main() { // 文件夹名 _dir := "data/test" exist,...
  • Python打包exe可执行文件(全)

    千次阅读 2021-11-22 16:11:20
    对于exe可执行文件,相信大家都不陌生,很多时候,我们写了python脚本,如果要在没有python环境的情况下使用,这时就需要打包成exe文件,但是如何将自己写的python文件或者脚本打包成exe可执行文件,这就是一个比较...
  • linux系统下编译cpp文件,使其成为可执行文件 如果我们在开发过程中,希望将cpp文件编译成为我们希望的可执行文件,我们应该怎么做呢?? 比如现在我们有一个demo.cpp 函数,我们在 linux 系统下如何编译程序并...
  • ldd 执行结果:不是动态可执行文件

    万次阅读 2020-12-18 23:03:05
    原因是缺少动态库,想到 busybox 应该不止依赖这一个库,想一次把所有依赖的动态库都拷贝过去,于是使用 ldd 查看 busybox 都依赖了哪些动态库,结果翻车了 $ ldd bin/busybox 不是动态可执行文件 心想可能因为这...
  • 生成的可执行文件会很小,在生成的服务器能执行,但是移植到其它服务器后就报上面的错误。 归根到底是-O0的原因,具体这个参数可以自行百度,这个当时我遇到这个问题也花了不少时间,后来查阅相关资料说和make的...
  • Clion快速生成可执行文件

    千次阅读 2020-11-15 22:33:46
    setting–> Plugins --> 搜索 C/C++ single File Execution --&...按Clion提示进行Clion的重启,重启之后,在生成cpp或c文件之后,在代码编译界面,右键 便不用单独在CMakeLists.txt中单独添加语句了。 ...
  • 如何将Python写的代码打包成.exe可执行文件

    万次阅读 多人点赞 2021-05-10 19:55:06
    有时候我们需要将自己写的代码打包成exe文件,给别人使用需要怎么办呢?以下将讲解Python代码如何打包成.exe文件。 1. 下载pyinstaller 因为Python中有很多三方包,我们想要这些三方包也包含在里面就需要一个工具,...
  • 如何将 Python 脚本封装成可执行文件

    千次阅读 多人点赞 2021-12-25 20:48:39
    可执行文件」常见如: Win 下后缀为 exe 的文件 Mac 下后缀为 app 的文件 在对应环境执行 Python 脚本,需要对应环境也同样有 Python 环境。这样在我们想给业务人员提供自动化的数据处理脚本 或 给女盆友绘制一...
  • pycharm生成可执行文件

    千次阅读 2020-01-31 20:02:39
    1.pycharm打开Terminal对话框: View->Tool Windows->Terminal 2.安装pyinstaller: pip3 install pyinstaller ...4.打开py文件所在的dist文件夹,可找到生成的可执行文件,双击可运行 附p...
  • 如何将Python程序打包成linux可执行文件方法1.安装环境2.打包程序3.执行文件 方法 前段时间尝试使用Python的tkinter制作了一个简单的丑丑的的图形化界面,现在想把它打包成Linux可执行文件,具体步骤如下: 1.安装...
  • Pycharm生成可执行文件.exe的实现方法

    万次阅读 2021-07-11 21:25:18
    1、打开Pycharm。在pycharm中安装插件pyinstaller ...-F(注意大写)是所有库文件打包成一个可执行文件,windows下是exe,-w是禁止弹出黑色控制台窗口。 如果你的项目调用了图片声音等本地资源,请将你的可执行文
  • Makefile编译成可执行文件

    千次阅读 2020-03-18 09:50:37
    将Makefile文件所在目录的.c和plat目录下的.c一起编译成可执行文件,头文件存放在inc目录下。Makefile文件如下: BIN=test CC=gcc CFLAGS=-DxDEBUG LIBS= INCS=-I./../inc/ SRCS:=$(wildcard *.c ../plat/*.c) ...
  • 如何用VS2017生成可执行文件

    万次阅读 多人点赞 2019-05-10 22:20:43
    在代码正确的情况下按如下操作进行 1 将解决方案配置中的debug(调试模式)改成release(发布模式)。 2 项目属性–>...3 重新生成解决方案后,找到项目文件夹下的release文件夹中的exe文件。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,612,373
精华内容 1,444,949
关键字:

可执行文件

友情链接: goed-wotation.zip