源代码_源代码下载 - CSDN
源代码 订阅
影片《源代码》是由邓肯·琼斯执导,杰克·吉伦哈尔、维拉·法米加、米歇尔·莫娜汉等人联袂出演。影片于2011年4月1日在美国上映。影片讲述了一位在阿富汗执行任务的美国空军飞行员柯尔特·史蒂文斯,醒来时发现自己正处在一辆前往芝加哥的火车上,并就此经历的一系列惊心动魄的事件。 [1] 展开全文
影片《源代码》是由邓肯·琼斯执导,杰克·吉伦哈尔、维拉·法米加、米歇尔·莫娜汉等人联袂出演。影片于2011年4月1日在美国上映。影片讲述了一位在阿富汗执行任务的美国空军飞行员柯尔特·史蒂文斯,醒来时发现自己正处在一辆前往芝加哥的火车上,并就此经历的一系列惊心动魄的事件。 [1]
信息
主    演
杰克·吉伦哈尔,维拉·法米加,米歇尔·莫娜汉
上映时间
2011年8月30日(中国内地)
色    彩
彩色
制片成本
3200万美元
导    演
邓肯·琼斯
其它译名
启动原始码/危机解密
类    型
科幻
分    级
USA:PG-13
出品公司
Vendome Pictures
拍摄日期
2010年4月
中文名
源代码
片    长
94min
发行公司
顶峰娱乐
外文名
Source Code
编    剧
本·瑞普利
对白语言
英语
出品时间
2011年
制片人
霍克·科奇、马克·戈登
拍摄地点
美国
制片地区
法国/美国
校园网起源
收起全文
精华内容
参与话题
  • 25个经典网站源代码

    千次下载 热门讨论 2020-07-30 23:30:36
    25个经典网站源代码 有简约的有时尚的方便大家参考、模仿。
  • 源代码.zip

    2020-07-30 23:31:38
    利用插值的方法,把站点资料转换为格点资料,用Fortran机型编程
  • 各种游戏(源代码

    2020-07-29 14:20:14
    初学时不知道做些什么 那么就来做些游戏吧 内附有源代码 清楚明了
  • 60个经典网站源代码

    2020-07-29 14:20:26
    60个经典网站源代码,有预览图,可能有部分重复。
  • 购物网站源代码

    热门讨论 2020-07-30 23:32:48
    代码,源代码,购物网站,电子商务,电子商务网站,.net代码,源代码,网站源代码,购物网站源代码,asp.net,asp.net的购物网站,sql2000数据库,vs2010平台,网站制作,网站制作源代码,c#,C#网站,C#购物网站,...
  • 一个源程序到一个可执行程序的过程:预编译、编译、汇编、链接。 其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义...一、预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则见...




    一个源程序到一个可执行程序的过程:预编译、编译、汇编、链接。
    其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。
    链接中,分为静态链接和动态链接,本文主要是静态链接。

    一、预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下
    1.删除所有的#define,展开所有的宏定义。
    2.处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
    3.处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
    4.删除所有的注释,“//”和“/**/”。
    5.保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。
    6.添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。

    C语言的宏替换和文件包含的工作,不归入编译器的范围,而是交给独立的预处理器。
    C语言中源代码文件的文件扩展名为.c,头文件的文件扩展名为.h,经预编译之后,生成xxx.i文件。
    在C++,源代码文件的扩展名是.cpp或.cxx,头文件的文件扩展名为.hpp,经预编译之后,生成xxx.ii文件。

    二、编译:把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件。

    (结合程序来说明编译的几个步骤)
    有C语言的源代码如下:
    arr[3] = (a+4)*(3+8);

    1.词法分析:利用类似于“有限状态机”的算法,将源代码程序输入到扫描机中,将其中的字符序列分割成一系列的记号
    以上的一行C语言程序,一共有16个空字符,经扫描机扫描之后,产生了16个记号。lex可以实现词法分析。见下表:

    这里写图片描述

    见上图:
    词法分析产生的记号分类有:关键字、标识符、字面量(数字、字符串)、特殊符号(加号、等号等)

    2.语法分析:语法分析器对由扫描器产生的记号,进行语法分析,产生语法树。由语法分析器输出的语法树是一种以表达式为节点的树。上述的代码就是
    各种表达式的组合:赋值表达式、加法表达式、乘法表达式、数组表达式和括号表达式组成的复杂表达式。yacc可以实现语法分析,根据用户给定的规则(不同的编程语言对应不同的语法规则)对记号表进行解析。

    这里写图片描述

    见上图:
    整个语句被看作是一个“赋值表达式”,“=”左边是一个“数组表达式”,右边是一个“乘法表达式”。数组表达式又由两个符号表达式组成,符号表达式就是最小的表达式,之后同理。

    在语法分析的同时,就把运算符的优先级确定了下来,如果出现表达式不合法,——各种括号不匹配、表达式中缺少操作,编译器就会报错。

    3.语义分析:语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。
    其中,静态语义通常包括:声明和类型的匹配,类型的转换,那么语义分析就会对这些方面进行检查,例如将一个int型赋值给int*型时,语义分析程序会发现这个类型不匹配,编译器就会报错。

    经过语义分析阶段之后,所有的符号都被标识了类型(如果有些类型需要做隐式转化,语义分析程序会在语法树中插入相应的转换节点),见下图:

    这里写图片描述
    这个语句中的类型都是int型,无须做转换。

    4.优化:*源代码级别的一个优化过程*,例如该语句中的(3+8)的值可以在编译期确定,源代码优化器会将整个语法树转换成中间代码——语法树的顺序表示,十分接近目标代码。
    中间代码有很多种类型,最常见的是“三地址码”和“P-代码”,其中三地址码的基本形式为:x = y op z,表示将变量y和z进行op操作后,赋值给x,op操作可以是加减乘除等。
    经优化之后的语法树为:

    这里写图片描述

    该语句的三地址码:
    t1 = 3 + 8;
    t2 = a + 4;
    t3 = t2 * t1;
    arr[3] = t3;

    t1由数字11代替,省去t3,经优化或的三地址码为:
    t2 = a +4;
    t2 = t2 + 11;
    arr[3] = t2;

    另一个关于中间代码的要点:中间代码使得编译器可以被分成前端和后端,编译器前端负责产生与机器无关的中间代码,编译器后端将中间代码转换为机器代码。
    源代码优化去产生中间代码标志着下面的过程都属于编译器后端,后端主要包括:代码生成器和目标代码优化器。

    5.目标代码生成:由代码生成器将中间代码转换成目标机器代码,生成一系列的代码序列——汇编语言表示。

    6.目标代码优化:目标代码优化器对上述的目标机器代码进行优化:寻找合适的寻址方式、使用位移来替代乘法运算、删除多余的指令等。

    上述的六个步骤完毕之后,编译过程也就告一段落了。最终产生了由汇编语言编写的目标代码

    gcc把预编译和编译两个步骤合并成一个步骤。对于C语言的代码,是用“cc1”这个程序来完成这两步,对于C++代码,对应的程序为“cc1plus”。gcc这个命令只是后台程序的包装,根据不同的参数去调用:预编译编译程序——cc1,汇编器——as,连接器——ld。

    C语言的代码,经编译后产生的文件名为xxx.s。

    三、汇编:将汇编代码转变成机器可以执行的指令(机器码文件)。
    汇编器的汇编过程相对于编译器来说更简单,没有复杂的语法,也没有语义,更不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译过来,汇编过程有汇编器as完成。

    经汇编之后,产生目标文件(与可执行文件格式几乎一样)xxx.o(Windows下)、xxx.obj(Linux下)。

    但是,经过预编译、编译、汇编之后,生成机器可以执行的目标文件之后,还有一个问题——变量a和数组arr的地址还没有确定。这就需要链接器来搞定啦~

    四、链接:
    1、历史过程:曾经,程序猿门在编程时,使用纸带作为最原始的存储设备,每当程序需要修改时,都要重新扎一条纸带,扎孔的表示1,不扎的是0,一串串1和0就组成了各种各样的指令——跳转等等….
    每一次的修改都非常痛苦,所以先知们就发明了汇编语言,这种编程语言方便之处在于符号的引用,表示跳转指令不再需要记住一串串0和1,终于可以使用符号——foo来表示这个动作了!
    随着汇编语言的普及,程序的代码量也就开始快速膨胀了,汇编语言说它也撑不住了….不过还好,高级编程语言Fortran、C、C++等一个接一个地问世,语言越来越方便了,追求perfect的人们就想:代码咋写更好呢?可不可以把代码按照功能的不同,分成不同的部分,便于日后的修改和重复使用呢?
    有了这个启发,程序猿们越来越得心应手,他们开始把代码按照功能和性质划分,分别形成不同的功能模块,不同的模块之间又按照各种结构来组织。
    发展到如今,软件的规模越来越大,代码动辄数百万行代码,放在一个模块那是万万不行的,维护起来会非常麻烦,所有现在的大型软件往往拥有成千上万的模块,
    模块之间相互独立又相互依赖。
    新的问题来了,一个程序被分割成这么多模块,最后要怎么把这些模块组合形成一个单一的程序?
    答案就是:模块之间,符号的引用
    这就像是一张画有大树的拼图,叶子、枝干、根系都零散的分布在那些拼图碎片上,想要看到完整的大树,我们就会耐心地把那些碎片拼合在一起。

    这里写图片描述

    这些模块之间同样如此,它们依靠那些凸起和凹陷联系在一起,最终组合成一个完整的程序,这样的过程称为——链接。

    这样基于符号的模块化,使得链接过程在整个程序开发中显得十分重要和突出…..

    2、下面就静态链接,进行分析。
    1.链接:“组装”模块的过程。
    2.链接的内容:把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接。(就像拼图,凸起和凹槽的位置一定一一对应,否则…)
    3.链接的过程:地址和空间的分配、符号决议(也叫“符号绑定”,倾向于动态链接)和重定位
    以gcc编译器为例,看基本的链接过程:

    这里写图片描述

    .c文件经过编译器、汇编器之后得到目标文件.o,目标文件再与库进行链接得到可执行文件.out。
    库其实就是一组目标文件的打包,这些目标文件中都是一些常用的代码。

    我们在fun.c模块中定义了函数foo(),在main.c模块中引用了foo()函数,在编译过程当中,编译器并不知道main.c中foo()的地址,所以将调用foo()的指令的目标地址部分搁置,
    等到了链接的阶段,链接器会去找到foo()定义的那个模块,在main.o中填入正确的函数地址,这个修改地址的过程被叫做“重定位”,每个被修正的地方叫“重定位入口”。

    这里写图片描述

    以上就是一个程序从源代码到可执行程序的大致过程,这是博主根据《程序员的自我修养——链接、装载与库》来整理的,有兴趣的同学可以自己去琢磨琢磨~





    原博客地址:https://blog.csdn.net/qq_39755395/article/details/78293733
    转载注明出处
    展开全文
  • Android 系统源码——下载到编译

    万次阅读 2020-09-30 15:19:26
    一直想下载、编译、调试一下Android源码 ,加强对一些framework的理解,搞了好多次,终于可以正常调试了。这里进行一些总结和分享。 Android源码到模拟器运行,主要有的四个步骤: 下载源码 ...

    一直想下载、编译、调试一下Android源码 ,加强对一些framework的理解,搞了好多次,终于可以正常调试了。这里进行一些总结和分享。

    Android源码到模拟器运行,主要有的四个步骤:

    1. 下载源码
    2. 搭建编译环境
    3. 准备编译

    我使用的环境是Ubuntu16.04 、openJDK8、Android 8.0.0

    硬件软件要求

    官方文档:要求

    硬件要求:

    • 如果是 Android 2.3.x (Gingerbread) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。
    • 如果要检出代码,至少需要 250GB 可用磁盘空间;如果要进行编译,则还需要 150GB。如果要进行多次编译,则需要更多空间。
    • 如果在虚拟机中运行 Linux,则至少需要 16GB 的 RAM/交换空间。

    我的电脑是双系统,ubuntu 空间划分不集中,分区空间不够,导致编译失败。我在实践过程中,发现不需要官方声明的那么多空间,下载初始化包.repo 40G左右,检出代码(Android 8.0.0),又占用了40G左右,编译用了60G左右。总共算下来160G的分区空间应该是够用了。

    一、 下载源码

    Android 源码是非常庞大的,而且每个模块都是用git来进行管理 ,整个Android源码是由很多个git项目构成,Google对Android代码的更新也是更新到相应模块的git项目上。

    那对于需要编译Android的开发者来说,要分别clone 每个git项目而且还要放到固定的位置确实是件惨绝人寰的事,所以Google就开发了一个基于Python编写的帮助开发者管理多个项目的工具,这个工具就叫repo,repo就是封装了git命令的python脚本。

    由于国内网络的原因,我们使用国内的清华源下载源码和repo工具

    1.1、下载repo

    下面的命令,是从清华源下载repo工具,这样脚本中的路径就是指向清华源的aosp

    mkdir ~/bin   # 在home下创建bin文件夹
    PATH=~/bin:$PATH   # 把bin文件夹加入环境变量的
    curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo  > ~/bin/repo #下载repo脚本
    chmod a+x ~/bin/repo #添加权限
    

    repo 工具讲解

    我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,…Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:

    在这里插入图片描述

    项目Pre进行分库的好处就是,只需要创建需要开发的模块分支,代码量减少了很多。检出的时候也可以只检出某一模块的代码。

    会遇到这么一个问题:如果我们想要创建Pre分支来做feature开发,这就意味着,我们需要到每个子项目中分别创建对应的分支,这个过程如果纯粹靠手工做,那简直是个灾难,于是会写个自动化处理程序(我们假设这个工具叫做RepoUtil)来帮助我们解决这个问题。这个RepoUtil也会有版本管理之类的需求,因此我们也用Git对其管理,并为其创建对应的仓库。此时整个项目的结构如下:

    在这里插入图片描述

    这里RepoUtil知道整个项目Pre下的每个子项目(即维护子项目的列表),同时提供对这些子项目的管理功能,比如统一创建分支等。但是从"单一职责"角度来看,RepoUitl这个工具的功能过于复杂,我们完全可以将维护子项目列表这个功能抽取出来作为一个新项目sub_projects,因为子项目也会变化。因此,为其创建对应的仓库,并用Git管理,RepoUtil只需要通过简单的对ub_projects进行依赖即可,此时整个项目的结构如下:
    在这里插入图片描述

    AOSP项目结构

    • .repo工具对应RepoUtil
    • mainfest对应sub_projects

    在mainfest文件夹中,执行git branch -a 就可以看到所有的分支

    1.2、下载源码

    下载源码有两种方法:

    1)Android 官方下载源代码

    官方文档:下载源代码

    2)使用初始化包(建议)

    初始化包每月都会进行更新,由于首次同步需要下载约 30GB 数据,如果上面的方法,过程中任何网络故障都可能造成同步失败,我第一次是使用官方的方法,失败过一次。后来都是用这个方法。

    下载 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下载完成后记得根据 checksum.txt 的内容校验一下。

    由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以我们只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。

    使用方法如下:

    wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
    tar xf aosp-latest.tar
    cd AOSP   # 解压得到的 AOSP 工程目录
    # 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.1_r1 # 可选命令,指定版本,如果未指定,则使用最新的版本
    repo sync # 正常同步一遍即可得到完整目录
    # 或 repo sync -l 仅checkout代码
    

    Android各版本列表:https://source.android.google.cn/setup/start/build-numbers.html#source-code-tags-and-builds

    二、搭建编译环境

    官方文档:搭建编译环境

    安装openJDK8

    sudo apt-get update
    sudo apt-get install openjdk-8-jdk
    

    安装软件包

    官方文档没有介绍Ubuntu 16.04所需的软件包。使用Ubuntu 16.04的小伙伴,需要安装下面的软件

    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
    sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
    sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
    sudo apt-get install git-core gnupg flex bison gperf build-essential  
    sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
    sudo apt-get install libc6-dev-i386 
    sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
    sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
    sudo apt-get install lib32z-dev ccache
    
    

    三、准备编译

    设置环境

    使用 envsetup.sh 脚本初始化环境。请注意,将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。

    source build/envsetup.sh
    

    或者

    . build/envsetup.sh
    

    选择目标

    使用 lunch 选择要编译的目标。确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整编译,并且所有调试功能均处于启用状态。

    lunch aosp_arm-eng
    

    直接运行 lunch (没有参数),会列出所有支持的类型,输入对应的序号来进行选择。
    在这里插入图片描述

    所有编译目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一:

    编译类型 使用情况
    user 权限受限;适用于生产环境
    userdebug 与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型
    eng 具有额外调试工具的开发配置

    源码编译

    您可以使用 make 编译任何代码。GNU make 可以借助 -jN 参数处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核 2 个线程)上,要实现最快的编译速度,可以使用介于 make -j16 到 make -j32 之间的命令。

    make -j4
    

    如果编译完一个版本后想重新编译一个,可以使用 make clobber清除之前编译生成的文件。我们编译产生的文件都在 out文件夹下。

    启动模拟器

    编译成功后,输入emulator可启动模拟器

    四、如何查看源码的版本

    方法一:

    每次执行完lunch后下次进入基本就忘记上次编译的参数设置,可以使用printconfig命令显示当前的设置

    方法二:

    1、 从代码中查看当前版本,找到如下文件

    build\make\core\version_defaults.mk
    

    搜索关键字 PLATFORM_VERSION

    # This is the canonical definition of the platform version,
    # which is the version that we reveal to the end user.
    # Update this value when the platform version changes (rather
    # than overriding it somewhere else).  Can be an arbitrary string.
    
    # When you add a new PLATFORM_VERSION which will result in a new
    # PLATFORM_SDK_VERSION please ensure you add a corresponding isAtLeast*
    # method in the following java file:
    # frameworks/support/compat/gingerbread/android/support/v4/os/BuildCompat.java
    
    # When you change PLATFORM_VERSION for a given PLATFORM_SDK_VERSION
    # please add that PLATFORM_VERSION to the following text file:
    # cts/tests/tests/os/assets/platform_versions.txt
    PLATFORM_VERSION.OPR1 := 8.0.0
    

    五、错误及解决方法

    由于在Ubuntu上开发,很多常用软件都没有,所以后来又在mac上编译源码,遇到不少问题,下面来分享一下

    错误 1、Could not find a supported mac sdk: [“10.10” “10.11” “10.12” “10.13” “10.14”]

    两种解决方法:

    1. 把当前系统有的sdk 版本,加入到这个列表中
    2. 下载列表中的sdk

    具体操作,下载地址,可以参考这里

    错误 2、在mac 10.15.4 上编译Android 8.0.0_r1 ,出现bad cpu type in executable

    这篇文章 也遇到这个错误,但是报错细节、Android版本号 和我的不一样,所以我暂时没有去尝试

    在苹果官网看到 关于bad cpu type in executable 回复 的,

    想了一下,既然Mac 10.15 支持64位,不支持32位,那就用新版Android吧,免得Android 8.0.0_r1 上越改问题越多

    错误3、在mac 10.15.4上编译Android10.0.0_r1,

    Android10.0.0_r1 是支持64位的,但是在编译过程中一定会遇到这个错误

    FAILED: build out/target/product/generic_x86_64/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests
    Outputs: out/target/product/generic_x86_64/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests
    Error: exited with code: 1
    Command: /bin/bash -c "(out/host/darwin-x86/bin/sepolicy_tests -l out/host/darwin-x86/lib64/libsepolwrap.dylib       -f out/target/product/generic_x86_64/obj/ETC/plat_file_contexts_intermediates/plat_file_contexts  -f out/target/product/generic_x86_64/obj/ETC/vendor_file_contexts_intermediates/vendor_file_contexts  -p out/target/product/generic_x86_64/obj/ETC/sepolicy_intermediates/sepolicy ) && (touch out/target/product/generic_x86_64/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests )"
    Output:
    /bin/bash: line 1: 28159 Segmentation fault: 11  ( out/host/darwin-x86/bin/sepolicy_tests -l out/host/darwin-x86/lib64/libsepolwrap.dylib -f out/target/product/generic_x86_64/obj/ETC/plat_file_contexts_intermediates/plat_file_contexts -f out/target/product/generic_x86_64/obj/ETC/vendor_file_contexts_intermediates/vendor_file_contexts -p out/target/product/generic_x86_64/obj/ETC/sepolicy_intermediates/sepolicy )
    

    这个错误是与mac 10.15 兼容问题,可通过这个临时解决

    make SELINUX_IGNORE_NEVERALLOWS=true
    

    还有个官方方案,打上下面的patch:(我是使用这个方法解决的)
    1f944107a3341ab593c93bbdf09e22436cc0e3d3

    官方就是修改 system/sepolicy/tests/Android.bp 去掉stl: “libc++_static”,

    下面这个是Catalina MacOS SDK 10.15的patch:
    89dad60ed5ec30b0f732b612d454151abdb4e449

    出自这篇文章:AOSP SELinux error

    错误4、Mac 下编译 关于 文件格式

    注意在mac 上编译,磁盘格式最好使用 Mac OS扩展(区分大小写,日志式),我在APFS 上解压aosp-laster.rar、同步代码、编译,完整操作了两次都不行。遇到同样的错误,也没再网上找到答案。也有可能是其它原因,按照官方的最好

    六、使用Android studio 查看源码

    Android Studio 导入 Android 源码

    IntelliJ IDEA导入Android源码

    注意:执行命令的时候,需要在bash 环境下,不能再zsh 环境下

    参考:
    官方文档:准备编译
    自己动手编译Android源码(超详细)
    Android 源码下载 到 编译全过程
    从源码中查看当前android版本
    android aosp编译的一些辅助命令

    展开全文
  • C++ 源代码到可执行代码的详细过程

    千次阅读 2018-07-17 09:31:07
    源代码-->预处理-->编译-->优化-->汇编-->链接-->可执行文件 Source--(编译)--> Assembly--(汇编)-->Obj--(链接)...

    编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。

    源代码-->预处理-->编译-->优化-->汇编-->链接-->可执行文件

    Source--(编译)--> Assembly--(汇编)-->Obj--(链接)-->PE/ELF

    gcc compilation



    1.编译预处理(Preprocessing)

    读取源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理

    通常使用以下命令来进行预处理:

    gcc -E hello.c -o hello.i

    参数-E表示只进行预处理 或者也可以使用以下指令完成预处理过程

    cpp hello.c > hello.i      /*  cpp – The C Preprocessor  */

    直接cat hello.i 你就可以看到预处理后的代码

    [析] 伪指令主要包括以下四个方面
    (1)宏定义指令,如#define Name TokenString,#undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现不再被替换。
    (2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉
    (3)头文件包含指令,如#include "FileName"或者#include <FileName>等。在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。
    包含到c源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include目录下。在程序中#include它们要使用尖括号(<>)。另外开发人员也可以定义自己的头文件,这些文件一般与c源程序放在同一目录下,此时在#include中要用双引号("")。
    (4)特殊符号,预编译程序可以识别一些特殊的符号。例如在源程序中出现的LINE标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译的C源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。
          预处理程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。

     

    2.编译阶段(Compilation)

     编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码。

    $gcc –S hello.i –o hello.s

    或者

    $ /usr/lib/gcc/i486-linux-gnu/4.4/cc1 hello.c

    注:现在版本的GCC把预处理和编译两个步骤合成一个步骤,用cc1工具来完成。gcc其实是后台程序的一些包装,根据不同参数去调用其他的实际处理程序,比如:预编译编译程序cc1、汇编器as、连接器l

        编译器在编译时是以c/c++文件为单位进行的, 如果项目中没有c/c++文件,那么你的项目将无法编译。经过预编译得到的输出文件中,将只有常量。如数字、字符串、变量的定义,以及C语言的关键字,如main,if,else,for,while,{,},+,-,*,\,等等。编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。

     



    3.优化阶段
        优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有很大的关系。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的。上图中,我们将优化阶段放在编译程序的后面,这是一种比较笼统的表示。

     对于前一种优化,主要的工作是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播,以及无用赋值的删除,等等。

    后一种类型的优化同机器的硬件结构密切相关,最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外,如何根据机器硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码比较短,执行的效率比较高,也是一个重要的研究课题。

    经过优化得到的汇编代码必须经过汇编程序的汇编转换成相应的机器指令,方可能被机器执行。

    4.汇编过程(Assembly)
     

    汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。

    $ gcc –c hello.c –o hello.o

    或者

    $ as hello.s –o hello.co目标文件由段组成。通常一个目标文件中至少有两个段:


    代码段  该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。

    数据段  主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。

    UNIX环境下主要有三种类型的目标文件:

    (1)可重定位文件  其中包含有适合于其它目标文件链接来创建一个可执行的或者共享的目标文件的代码和数据。

    (2)共享的目标文件  这种文件存放了适合于在两种上下文里链接的代码和数据。第一种事链接程序可把它与其它可重定位文件及共享的目标文件一起处理来创建另一个目标文件;第二种是动态链接程序将它与另一个可执行文件及其它的共享目标文件结合到一起,创建一个进程映象。

    (3)可执行文件   它包含了一个可以被操作系统创建一个进程来执行之的文件。

    汇编程序生成的实际上是第一种类型的目标文件。对于后两种还需要其他的一些处理方能得到,这个就是链接程序的工作了。

    5.链接程序(Linking)

    由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。

    通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件。

    ld -static crt1.o crti.o crtbeginT.o hello.o -start-group -lgcc -lgcc_eh -lc-end-group crtend.o crtn.o (省略了文件的路径名)。

    链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。

    根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:

    (1)静态链接 在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。(个人备注:静态链接将链接库的代码复制到可执行程序中,使得可执行程序体积变大)

    (2)动态链接  在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。(个人备注:动态链接指的是需要链接的代码放到一个共享对象中,共享对象映射到进程虚地址空间,链接程序记录可执行程序将来需要用的代码信息,根据这些信息迅速定位相应的代码片段。)

      对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。


    经过上述五个过程,C++源程序就最终被转换成可执行文件了。缺省情况下这个可执行文件的名字被命名为a.out。

    展开全文
  • 了解源代码管理工具——Github

    千次阅读 2019-07-04 10:35:09
    一、了解Git和Github Git: 一个免费、开源的版本控制软件 Github:全球最大的社交编程及...两者关系:Git是版本控制软件,Github是项目代码托管的平台,借助git来管理项目代码。 二、使用Github 1、基本概念 ...

    一、了解Git和Github

    Git: 一个免费、开源的版本控制软件

    Github:全球最大的社交编程及代码托管网站(https://github.com/)。

    Github可以托管各种git库,并提供一个web界面(用户名.github.io/仓库名)

    两者关系:Git是版本控制软件,Github是项目代码托管的平台,借助git来管理项目代码。

    二、使用Github

    1、基本概念

    仓库(Repository):用来存放项目代码,每个项目对应一个仓库,多个开源项目则有多个仓库。

    收藏(Star):收藏项目,方便下次查看。

    复制克隆项目(Fork):复制后的项目是独立存在的。

    关注(Watch):关注项目,当项目更新可以接收到通知。

    事务卡片(Issue):发现代码BUG,但是目前没有成型代码,需要讨论时用。

    Github主页:账号创建成功或点击网址导航栏github图标都可进入github主页:该页左侧主要显示用户动态以及关注用户或关注仓库的动态;右侧显示所有的git库。

    仓库主页:主要显示项目的信息,如:项目代码,版本,收藏/关注/fork情况等

    个人主页:个人信息如头像,个人简介,关注我的人,我关注的人,我关注的git库,我的开源项目,我贡献的开源项目等信息

    2、注册Github账号

    (1)登录Github官网 :https://github.com/ 

     (2)若未注册:点击Sign Up,填写用户名、邮箱以及密码进行注册

     

     若已注册:点击Sign In,填写用户名/邮箱和密码进行登录。

     

     (3)注册/登录成功,进入Github主页

     

    注:新注册的用户必须验证邮箱后才可以创建git库的仓库

    3、创建仓库/创建新项目

    一个git库(仓库)对应一个开源项目,通过git管理git库。

    创建仓库:

    (1)点击 Start a  project 创建一个仓库

     

    (2)填写仓库名称,项目描述等详细信息后,点击Create repository完成创建。

     

    填写完毕后如下图所示:

     

    (3)创建成功后的仓库主页

    4、仓库管理

    (1)点击 Create new file创建仓库文件

     

     (2)填写文件名及文件内容

     

    (3)填写提交的标题及信息

     

    (4)创建文件之后,自动跳转到仓库主页

     

    (5)点击文件名称可进入文件详情页,对文件进行修改或删除

    修改文件

     

     

    (6)点击 Upload files上传文件

     

    (7)点击 choose your files 上传文件

    (注:一次可以上传多个文件)

     

    Php1.txt是上传的文件,上传成功后出现仓库文件里:

     

    (8)点击 Find file搜索仓库文件

    如搜索php:

     

    (9)点击 Clone or download,下载或检出项目

    注:这里有两种方法 Clone with HTTP或者Use SSH

     

    5、Github Issues

    发现代码BUG,但是目前没有成型代码,需要讨论时用;或者使用开源项目出现问题时使用 。

     

    提交一个issue

     

    发现一个Bug

     

    回复Thanks再关闭改issue

     

    可在列表切换状态

     

    6、个人主页

    点击用户名或者Your profile进入个人主页

     

    个人主页显示:头像,用户名,加入时间,关注的项目,关注的用户,仓库等信息。

     

    (1)收藏:打开对应项目主页,点击右上角  star 按钮即可收藏

     

    查看收藏:

     

    (2)关注(Watch)

     

    (3)复制项目(Fork)

     

    复制完成后,所选项目出现在自己的仓库中

    (注:复制后的仓库是独立存在的)

     

    7、发起请求(Pull Request)

    点击 Pull request

     

     若有更新可以发起请求创建一个pull request,若无更新则显示下图:

     

    三、Git安装和使用

    1、下载安装

    GIt官网下载:https://www.git-scm.com/download/win

     

    以下为安装过程:

     

    选择安装的工作目录

     

    选择组件

     

    开始菜单目录名设置

     

    选择使用命令环境

     

    Git安装完成

    启动后显示下图:

    鼠标右键后,点击Git Bash Here

    2、Git初始化及仓库创建和操作

    (1)基本信息设置

    设置用户名和邮箱

    (2)初始化一个新的Git仓库

    创建文件夹

     

    在文件内初始化Git

     

    (3)在仓库中添加文件

    添加文件test1.php

    添加文件test2.java

     

    添加test1.php到缓存区

     

    将文件从暂存区提到仓库

     

    (4)修改仓库文件

    修改文件,添加到暂存区

     

     

    注:

    使用git commit --amend命令(修改最近一次提交的注释信息 ),会进入到vim编辑器。然后你会发现编辑器里你怎么输入都没反应,这是因为vim处在不可编辑状态,按下字母键C (此时进入编辑状态),可以开始修改注释信息了。

    修改好后,你会发现怎么都退出不了,然后如下操作:

    按下Esc (退出编辑状态),接着连按两次大写字母Z ,就可以保存好退出来了!

     

    (5)删除仓库文件

    删除仓库文件test1.php

     

    删除完成后打开test文件夹进行检查,test1.php已被删除。

     

    (6)Git克隆操作

    a.将远程仓库(github对应的项目)复制到本地

     

    在test文件夹中查看

    由下图:test-by-tao已被成功复制到本地

     

     

    b. 将本地仓库同步到git远程仓库中

    • 创建文件
    • 添加到暂存区
    • 添加到本地仓库
    • 添加到远程仓库

     

    3、GithubPages 搭建网站

    创建个人站点->新建仓库(注:仓库名必须是 用户名.github.io)

    填写该仓库的详细信息

     

     

    输入链接打开网页

    (注:github pages 仅支持静态网页)

     

     

     

     

     

     

     

     

     

     

     

     

     

    转载于:https://www.cnblogs.com/tyt-/p/10890140.html

    展开全文
  • 登录界面源代码

    万次阅读 2018-09-19 10:46:38
    &amp;amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;quot; encoding=&amp;amp;quot;utf-8&amp;amp;quot;?&amp;amp;amp;gt; &amp;amp;amp;lt;LinearLayout ...quot
  • 如何看懂源代码--(分析源代码方法)

    万次阅读 多人点赞 2018-03-15 11:49:31
    不管是参考也好,从开源抓下来研究也好,为了了解箇中含意,在有限的时间下,不免会对庞大的源代码解读感到压力。 网路上有一篇关于分析看代码的方法,做为程序设计师的您,不妨参考看看, 换个角度来分析。 也能...
  • discuz源代码分析

    千次阅读 2019-01-01 17:27:23
    2014年03月07日 11:51:34 囧 阅读数:3604 标签: 源代码代码分析discuz 收起 个人分类: PHP 第一个文件当然是分析./include/common.inc.php这个文件,这个是Discuz的核心中的核心,基本上每次操作都...
  • #本文章仅用于记录本人学习过程,当作笔记来用,如有侵权请及时告知,谢谢! me页面有四个文件 接下来我们一个一个文件分析: 首先是me.js: Page({ data:{ //定义一个data方法 userinfo:{},//创建一个userinfo...
  • Qt界面开发(一)(各种控件以及图表)

    万次阅读 多人点赞 2020-07-25 10:38:37
    注:资源主要来源:http://www.qtcn.org/bbs/u/110085(刘大神) 如若侵权,请联系删除。 本文只是将作品集合到起来,方便大家一起学习。 ... Qt界面开发(各种控件以及图表) ...源代码链接:点击打开链接 2....
  • 手机chrome浏览器查看网页源码

    万次阅读 2018-11-15 14:43:39
    手机chrome浏览器下,在网址前面加上view-source: 重新请求即可
  • 框架源代码和网页源代码有什么区别,看了一个纯js的效果,想查看源代码 出现框架源代码和网页源代码,有什么区别 谢谢
  • 源代码与原始版本不同,请在断点选项里设置允许源代码与原始版本不同。这个是针对单个断点进行设置。如果要对所有的断点进行设置,则要在“工具”——〉“选项”——〉“调试”——〉“要求源文件与原始版本完成匹配...
  • Qt界面开发(各种控件以及图表)

    万次阅读 多人点赞 2018-09-15 15:17:49
    源代码链接:点击打开链接 2.QT漂亮界面   源代码链接:点击打开链接 3.音乐播放器界面 源代码链接:点击打开链接 4.六宫格界面 源代码链接:点击打开链接 5.漂亮通用界面 源代码链接:点击打开...
  • 在Eclipse中关联源代码

    万次阅读 多人点赞 2013-06-02 16:35:14
    在使用Eclipse的时候,为了查看一些Java代码的具体实现,通常需要查看一些源代码,但是有些时候都是我们使用到了某个类,想查看它的源代码的时候,才去关联源代码,而我一直想知道这么一个问题:当我在没有想看...
  • 打开网页源代码network下的doc查看请求与响应信息
1 2 3 4 5 ... 20
收藏数 2,168,483
精华内容 867,393
关键字:

源代码