免费获客网站、免费获客平台、免费产品获客【风起获客】风起获客
  • 首页
  • 供应商
  • 采购商
  • 找企业
  • 找产品
  • 论坛
登录 / 注册

pycharm无法安装编译器,编译器工作过程简析

peoi6913157
2024-10-20
42
分享

专业编程培训机构——完成蜕变以后轻松拿高薪

电话+V:159999-78052 ,欢迎咨询编译器怎么装到内存中去,[python实用课程],[C++单片机原理],[C#网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]

一、pycharm无法安装编译器

pycharm安装不了编译器是方式错了。

1、去Pycharm官网,下载PyCharm安装包。

2、根据自己电脑的操作系统进行选择,对于windows系统选择框框所包含的安装包。

3、双击下载的安装包,进行安装,安装好后会弹出界面。

4、选择安装目录,Pycharm需要的内存很大,需要安装在D盘或者E盘,不能放在系统C盘。

5、点击Next,进入下一个界面后,耐心的等待两分钟。

二、C或C++程序编译时内存分为几个存储区

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区

1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

编译器工作过程简析

2020-07-1322:54·韦东山嵌入式Linux

作者:阮一峰

源码要运行,必须先转成二进制的机器码。这是编译器的任务。

比如,下面这段源码(假定文件名叫做test.c):

#include<stdio.h>intmain(void){fputs("Hello,world!",stdout);return0;}

要先用编译器处理一下才能运行,编译步骤如下:

$gcctest.c$./a.outHello,world!

对于复杂的项目,编译过程还必须分成三步。

$./configure$make$makeinstall

这些命令到底在干什么?大多数的书籍和资料,都语焉不详,只说这样就可以编译了,没有进一步的解释。

本文将介绍编译器的工作过程,也就是上面这三个命令各自的任务。我主要参考了AlexSmith的文章《BuildingCProjects》。需要声明的是,本文主要针对gcc编译器,也就是针对C和C++,不一定适用于其他语言的编译。

第一步配置(configure)

编译器在开始工作之前,需要知道当前的系统环境,比如标准库在哪里、软件的安装位置在哪里、需要安装哪些组件等等。这是因为不同计算机的系统环境不一样,通过指定编译参数,编译器就可以灵活适应环境,编译出各种环境都能运行的机器码。这个确定编译参数的步骤,就叫做"配置"(configure)。

这些配置信息保存在一个配置文件之中,约定俗成是一个叫做configure的脚本文件。通常它是由autoconf工具生成的。编译器通过运行这个脚本,获知编译参数。

configure脚本已经尽量考虑到不同系统的差异,并且对各种编译参数给出了默认值。如果用户的系统环境比较特别,或者有一些特定的需求,就需要手动向configure脚本提供编译参数:

$./configure--prefix=/www--with-mysql

上面代码是php源码的一种编译配置,用户指定安装后的文件保存在www目录,并且编译时加入mysql模块的支持。


第二步确定标准库和头文件的位置

源码肯定会用到标准库函数(standardlibrary)和头文件(header)。它们可以存放在系统的任意目录中,编译器实际上没办法自动检测它们的位置,只有通过配置文件才能知道。

编译的第二步,就是从配置文件中知道标准库和头文件的位置。一般来说,配置文件会给出一个清单,列出几个具体的目录。等到编译时,编译器就按顺序到这几个目录中,寻找目标。



第三步确定依赖关系

对于大型项目来说,源码文件之间往往存在依赖关系,编译器需要确定编译的先后顺序。假定A文件依赖于B文件,编译器应该保证做到下面两点。

(1)只有在B文件编译完成后,才开始编译A文件。

(2)当B文件发生变化时,A文件会被重新编译。

编译顺序保存在一个叫做makefile的文件中,里面列出哪个文件先编译,哪个文件后编译。而makefile文件由configure脚本运行生成,这就是为什么编译时configure必须首先运行的原因。

在确定依赖关系的同时,编译器也确定了,编译时会用到哪些头文件。


第四步头文件的预编译(precompilation)

不同的源码文件,可能引用同一个头文件(比如stdio.h)。编译的时候,头文件也必须一起编译。为了节省时间,编译器会在编译源码之前,先编译头文件。这保证了头文件只需编译一次,不必每次用到的时候,都重新编译了。

不过,并不是头文件的所有内容,都会被预编译。用来声明宏的#define命令,就不会被预编译。


第五步预处理(Preprocessing)

预编译完成后,编译器就开始替换掉源码中bash的头文件和宏。以本文开头的那段源码为例,它包含头文件stdio.h,替换后的样子如下。

externintfputs(constchar*,FILE*);externFILE*stdout;intmain(void){fputs("Hello,world!",stdout);return0;}

为了便于阅读,上面代码只截取了头文件中与源码相关的那部分,即fputs和FILE的声明,省略了stdio.h的其他部分(因为它们非常长)。另外,上面代码的头文件没有经过预编译,而实际上,插入源码的是预编译后的结果。编译器在这一步还会移除注释。

这一步称为"预处理"(Preprocessing),因为完成之后,就要开始真正的处理了。


第六步编译(Compilation)

预处理之后,编译器就开始生成机器码。对于某些编译器来说,还存在一个中间步骤,会先把源码转为汇编码(assembly),然后再把汇编码转为机器码。

编译器怎么装到内存中去

下面是本文开头的那段源码转成的汇编码。

.file"test.c".section.rodata.LC0:.string"Hello,world!".text.globlmain.typemain,@functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset16.cfi_offset6,-16movq%rsp,%rbp.cfi_def_cfa_register6movqstdout(%rip),%raxmovq%rax,%rcxmovl$14,%edxmovl$1,%esimovl$.LC0,%edicallfwritemovl$0,%eaxpopq%rbp.cfi_def_cfa7,8ret.cfi_endproc.LFE0:.sizemain,.-main.ident"GCC:(Debian4.9.1-19)4.9.1".section.note.GNU-stack,"",@progbits

这种转码后的文件称为对象文件(objectfile)。



第七步连接(Linking)

对象文件还不能运行,必须进一步转成可执行文件。如果你仔细看上一步的转码结果,会发现其中引用了stdout函数和fwrite函数。也就是说,程序要正常运行,除了上面的代码以外,还必须有stdout和fwrite这两个函数的代码,它们是由C语言的标准库提供的。

编译器的下一步工作,就是把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。这就叫做连接(linking)。这种通过拷贝,将外部函数库添加到可执行文件的方式,叫做静态连接(staticlinking),后文会提到还有动态连接(dynamiclinking)。

make命令的作用,就是从第四步头文件预编译开始,一直到做完这一步。


第八步安装(Installation)

上一步的连接是在内存中进行的,即编译器在内存中生成了可执行文件。下一步,必须将可执行文件保存到用户事先指定的安装目录。

表面上,这一步很简单,就是将可执行文件(连带相关的数据文件)拷贝过去就行了。但是实际上,这一步还必须完成创建目录、保存文件、设置权限等步骤。这整个的保存过程就称为"安装"(Installation)。


第九步操作系统连接

可执行文件安装后,必须以某种方式通知操作系统,让其知道可以使用这个程序了。比如,我们安装了一个文本阅读程序,往往希望双击txt文件,该程序就会自动运行。

这就要求在操作系统中,登记这个程序的元数据:文件名、文件描述、关联后缀名等等。Linux系统中,这些信息通常保存在/usr/share/applications目录下的.desktop文件中。另外,在Windows操作系统中,还需要在Start启动菜单中,建立一个快捷方式。

这些事情就叫做"操作系统连接"。makeinstall命令,就用来完成"安装"和"操作系统连接"这两步。


第十步生成安装包

写到这里,源码编译的整个过程就基本完成了。但是只有很少一部分用户,愿意耐着性子,从头到尾做一遍这个过程。事实上,如果你只有源码可以交给用户,他们会认定你是一个不友好的家伙。大部分用户要的是一个二进制的可执行程序,立刻就能运行。这就要求开发者,将上一步生成的可执行文件,做成可以分发的安装包。

所以,编译器还必须有生成安装包的功能。通常是将可执行文件(连带相关的数据文件),以某种目录结构,保存成压缩文件包,交给用户。



第十一步动态连接(Dynamiclinking)

正常情况下,到这一步,程序已经可以运行了。至于运行期间(runtime)发生的事情,与编译器一概无关。但是,开发者可以在编译阶段选择可执行文件连接外部函数库的方式,到底是静态连接(编译时连接),还是动态连接(运行时连接)。所以,最后还要提一下,什么叫做动态连接。

前面已经说过,静态连接就是把外部函数库,拷贝到可执行文件中。这样做的好处是,适用范围比较广,不用担心用户机器缺少某个库文件;缺点是安装包会比较大,而且多个应用程序之间,无法共享库文件。

动态连接的做法正好相反,外部函数库不进入安装包,只在运行时动态引用。好处是安装包会比较小,多个应用程序可以共享库文件;缺点是用户必须事先安装好库文件,而且版本和安装位置都必须符合要求,否则就不能正常运行。

现实中,大部分软件采用动态连接,共享库文件。这种动态共享的库文件,Linux平台是后缀名为.so的文件,Windows平台是.dll文件,Mac平台是.dylib文件。

-完-


关于WiFi必须了解的基础知识

精华|关于uboot一些概念(依然很多人不会)

通俗易懂讲解DDR内存的"秘密"

了解更多

【WINDRISES EMPLOYMENT PROGRAMMING】尊享对接老板

电话+V:159999-78052

机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。

编译器怎么装到内存中去
相关新闻
  • 01
    牡丹鹦鹉最珍贵的品种|头类牡丹鹦鹉的所有品种,附图对比,避免踩雷(养殖需办证)
    509
  • 02
    iPhone 销量大跌,降价促销,苹果为何不香了?
    98
  • 03
    安卓手机怎么下载苹果app,怎么在安卓手机上安装苹果的应用程序和游戏?你要了解的最佳方案
    92
  • 04
    em>存货”和“库存商品”有什么不同,企业生产过程中产生的废料如何进行会计处理?
    89
  • 05
    蓝莓价格大跳水 价格低至9.9元一盒
    87
  • 06
    中小学教师退出机制是什么意思?
    85
  • 07
    广东家居品牌尾货一手货源在哪里,卖品牌库存家具尾货,没有任何技巧,全靠高品质和亲民的价格
    59
  • 08
    kiwi浏览器怎么安装插件,windows下,Kiwi_Syslog日志服务器的搭建
    55
  • 09
    jre已安装但无法启动请检查浏览器安全配置,启明信息申请muslgcc编译运行环境下获取程序地址的方法专利,实现...
    54
  • 10
    杭州亚运会游泳金牌名单,游泳运动员张雨霏可能被美方“批捕”,国际奥委会力挺其无罪
    52
  • 11
    触犯刑法构成刑事犯罪者给予什么处分,公务员被开除后,如何执行解雇程序呢?
    52
  • 12
    浅度分析:拥有洲际弹道导弹的朝鲜,未来会不会裁军?朝鲜或发射洲际导弹,日防相:射程最远可达1.5万千米,涵盖美国本土
    45
  • 13
    为什么贵州茅台这么贵呢?贵州茅台:飞天茅台价格全线飙升 11 月或推迟放货
    43
  • 14
    pycharm无法安装编译器,编译器工作过程简析
    42
  • 15
    vip会员卡系统怎么做?美发店会员卡怎么卖,顾客才会毫不犹豫的买账?
    40
相关广告
广告图
联系方式 微信
引擎网址:
百度
雅虎
360
谷歌
必应
本站导航:
首页
找供应商
找采购商
找企业
找产品
论坛
站点地图
友情链接:
太平洋
中关村
阿里巴巴
凤凰
新浪
腾讯
网易
搜狐
百度
交换链接:
免费获客网站、免费获客平台、免费产品获客【风起获客】
粤ICP备2024275337号-1 地址:广州市中山大道西1344号神秘花园1F1002 24小时服务热线:15999978052 联系QQ:1258690818 隐私条款
广州风起网络科技有限公司 Copyright © 2020 - 2025