百度百科:

  程序编译时生成的中间代码文件。目标文件,一般是程序编译后的二进制文件,再通过链接器(LINK.EXE)和资源文件链接就成可执行文件了。OBJ只给出了程序的相对地址,而可执行文件是绝对地址。[1]

     这个问题不是很简单,你只看到了文件从源代码到EXE文件这个流程中的一小部分。要详细的深究这个问题,需要很多时间和精力。
 
 
    
    
     应该是在上图的第四个步骤,会产生obj文件。但它表述的还不够全面,少了一个链接的部分,所以应该在第五步之前再加上一个链接的步骤;
     资源链接很好理解,但链接器(LINK.EXE)?
    ——链接器(LINK.EXE)是链接.lib文件、.obj目标文件、.res;.lib文件又称之为导入库文件,只记录了函数所在DLL的位置。
 
.lib导入库的概念:     
     导入库是一个很棒的做法,如果硬件将平台比作房子,系统比作苦力,API比作积木;然后我们要写的程序比作一张图纸,要苦力按照图纸搭建成我们所需要的积木形状;我们所写的源代码更多,更形象的是完成这个积木的思想,API更像是在这间房子里,所有能让苦力完成这个积木素材。而导入库的概念,就好比将我写的源代码思想通过编译器、资源编译器、链接器翻译成苦力能懂的鸟语。然后链接器再链接.lib文件,告诉苦力需要搭建的积木的素材都在什么地方,让你好去找啊?如果苦力没有,我做好了这个素材直接给你就得了(如DLL、声音、图片、光标)。如果你有我还给苦力另一个同样的积木(Dos下的静态库),那不是脱了裤子放屁么?
.obj目标文件的概念:
  可见,在我们的编程语言和计算机中间多了一个编译器,我更形象的将它理解为我们与计算机之间的翻译。翻译做的事情,我必然看不懂,但它的工作成果就是obj、res、exe这些二进制文件;所有的翻译,在某种程度上都存在欺骗的可能性...这是题外话,所以obj文件是什么?是计算机所能理解的二进制代码,是编译成exe过程中需要的第一步、是ML.exe运行后的结果。
.obj和.exe有什么不同?换句话说编译器和链接器分别做了什么呢:
  从表面上看.obj不能执行,但是.exe可以执行.还有他们的后缀名不同、.exe比.obj多了.lib、.res文件;除此之外,要论述<.obj和.exe有什么不同>这个问题,那么必然要切入<编译器和链接器分别做了什么呢>这个问题,但是这已经超出我问这个问题的初衷了.我会有这个问题只是因为<编译执行和解释执行有什么差别,为什么会产生.obj文件,而obj文件又是什么>这个问题.从此问题引申出来的其他问题,就不在深究,留在以后再说吧...
编译执行和解释执行:
  这个问题是这些问题的原始问题,换句话说其他问题都是这个问题的延伸;如果抽象一下也很有意思的,编译执行就好像是Link.exe直接给了苦力一张它懂的纸条,我全部都苦力你干什么,干完就完事;而解释执行就好像给苦力陪了一台随身携带的翻译器,苦力劳作一下,翻译器再告诉苦力下一个命令,直到苦力将翻译器中的所有命令都完成才罢休。
  这个比喻也完美的解释了“解释执行能跨平台,而编译执行却不行”,因为后者直接给了一张纸,要么苦力看得懂,要么苦力看不懂,看不懂那就干不了,这很正常(因为苦力也分种族)...而前者直接实现了“人工智能”,苦力是哪里的人翻译器就说哪里的话..速度的问题,也完美的解释了,一张纸和翻译器相比,当然前者更快...
什么是相对地址:
 
什么是绝对地址:  
 

什么是obj文件?的更多相关文章

  1. CSharpGL(9)解析OBJ文件并用CSharpGL渲染

    CSharpGL(9)解析OBJ文件并用CSharpGL渲染 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...

  2. [计算机图形学] OpenGL读取obj文件并显示其3D效果

     读取三维网格模型(Wavefront OBJ文件) 无法向立方体:cube.obj 有法向兔子模型:bunny.obj 有法向有纹理八字模型:Eight.obj OBJ文件的格式可参考:http: ...

  3. delphi 连接 c++ builder 生成obj文件

    delphi 连接 c++ builder 生成obj文件 delphi 可以连接c++ builder 生成OMF格式的obj文件,会报一个错.[DCC Error] E2065 Unsatisfi ...

  4. obj文件的连接问题以及tlib的基本用法

    1.基础研究 用tcc将程序编译为.obj文件. 这里也可以使用tcc -linclude run.c来将run.c文件编译成run.obj文件. 再用tcc对下面的程序进行编译链接,发现提示错误: ...

  5. 软件光栅器实现(四、OBJ文件加载)

    本节介绍软件光栅器的OBJ和MTL文件加载,转载请注明出处. 在管线的应用程序阶段,我们需要设置光栅器所渲染的模型数据.这些模型数据包括模型顶点的坐标.纹理.法线和材质等等,可以由我们手动编写,也可以 ...

  6. 链接学习之obj文件探索

    Windows的gcc环境,往官网http://sourceforge.net/project/showfiles.php?group_id=2435 下载MinGW,安装,安装完毕后按照包 配置环境 ...

  7. 谷歌开发的draco格式文件将obj文件压缩成drc文件后将大大减小文件大小(threejs加载有mtl文件的drc文件)

    问题描述:当前threejs是92版本 但是当前版本还没有能够直接加载带贴图文件的drc格式的loader: 解决办法:先加载mtl文件将obj文件分解(按照mtl文件内材质贴图信息进行分解)再将分解 ...

  8. 访问 .obj文件,由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射

    一.错误描述 HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 最可能的原因: 可 ...

  9. C#快速删除bin和obj文件夹的方法

    C#程序总会生成bin和obj文件夹,为了减小源码的大小,就有必要将这两个文件夹删除,于是想到用批处理文件来删除. 以下是批处理的代码: @echo offset nowPath=%cd%cd /cd ...

  10. 读取obj文件用Mesh创建实例化

    using UnityEngine; using System.Collections; using System.IO; using System.Collections.Generic; usin ...

随机推荐

  1. RTP Payload Format for Opus Speech and Audio Codec

    [Docs] [txt|pdf] [Tracker] [WG] [Email] [Diff1] [Diff2] [Nits] Versions: (draft-spittka-payload-rtp- ...

  2. 幻想乡三连B:连在一起的幻想乡

    $G[k][x]$表示所有$x$个点的无向图中每一个图的边数的$k$次方之和. $F[k][x]$就是在$G[k][x]$的基础上加了一个整体连通的性质. 有一个经典的套路就是对于$F$在对应的$G$ ...

  3. Gym - 100851L:Landscape Improved (二分+单调性)

    题意: 一个宽度为N的网格图,i上有h[i]高的方块.现在你有W个方块,问怎么放使得最终的最高点最高.   当一个格子的下方,左下方和右下方都有方块那么久可以把方块放到这个格子上.最左端和最右端不能放 ...

  4. 2017-2018-1 20179215《Linux内核原理与分析》第七周作业

    一.实验部分:分析Linux内核创建一个新进程的过程. [第一部分] 根据要求完成第一部分,步骤如下: 1. 首先进入虚拟机,打开终端,这命令行依次敲入以下命令: cd LinuxKernel    ...

  5. 【QT】对Qt项目开发中遇到的问题的总结

    1. QMessageBox中文乱码 这里的中文乱码是指只有QMessageBox才出现中文乱码,其他都可以正常使用的情况.有些博客中提到使用QString::fromUtf8()函数, 实测有些情况 ...

  6. JS性能之滚动条之外的其他部分

    问题: 如果一个页面宽高比较大,也就是页面需要滚动条来查看其他页面内容,这时候,在滚动条之外的其他部分,是依然处于运行状态. 比如那部分有视频播放,则那些视频虽然在当前窗口看不到,但它们还是会处于播放 ...

  7. tomcat部署虚拟主机-搭建两个应用以及httpd和Nginx的反向代理

    实验环境:CentOS7 前提:已经安装好tomcat,未安装请查看http://www.cnblogs.com/wzhuo/p/7111135.html: 目的:基于主机名访问两个应用: [root ...

  8. oracle--分页过程demo1

    oracle分页过程demo1: --ROWNUM用法 select o.*,rownum rn from (select * from emp) o where rownum<=10; sel ...

  9. Oracle中生成UUID

    Oracle中生成跨系统的唯一识别符UUID非常方便,比生成序列还简单,直接用sys_guid()就行, 例如select sys_guid() from dual 会产生一个跟MAC地址.生成时间相 ...

  10. C#自定义控件 ————进度条

    先看看样式 一个扇形的进度条 对外公开的方法和属性 事件 value_change;//值改变时触发的事件progress_finshed;//进度条跑完时触发的事件 属性 Max_value//获取 ...