A. c++ obj文件与exe文件的区别
编译:当前源代码编译成二进制目标文件(.obj文件)
链接(link):将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件)。
可以说.obj文件是.exe文件的前身;
1、obj里存的是编译后的代码跟数据,并且有名称,所以在连接时会出现未解决的外部符号一说。当连成exe后便不存在名称的概念了,只有地址。lib就是一堆obj的组合。
编译器会默认链接一些常用的库,其它的需要你自己指定。
2、目标文件,一般是程序编译后的【二进制文件】,再通过链接器和资源文件链接就成可执行文件了。OBJ只给出了程序的【相对地址】,而可执行文件是【绝对地址】。CPP对应的二进制代码格式obj,是未经重定位的!
3、编译C 程序会产生obj 文件和exe 文件,我们都知道exe 文件是可执行文件,但obj 文件是做什么用的呢?
查了下资料发现obj 文件和exe 文件都是二进制数据文件,其中obj 文件是COFF 格式,exe 文件时PE 格式。
那为什么不直接让 obj 文件作为可执行文件呢?
原来obj 文件的格式是跨平台 的,通过link 可以将obj 链接为所使用系统能够识别的格式,比如windows 系统中的exe 文件。
一个现代编译器的主要工作流程如下:
源程序(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标程序(object code)→ 连接器(链接器,Linker)→ 可执行程序(executables)
(1)c程序编译obj是什么文件扩展阅读
C++编译 (.obj, .lib, .dll, .exe的关系)
一、总体介绍:
c++程序在编译后,在目标路径下会生成多个文件:
Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg
*.exe:是生成的可执行文件
*.ilk:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息
*.obj:是目标文件,源程序编译后的产物
*.pch:全称是PreCompiled Header,就是预先编译好的头文件
*.idb:文件保存的信息,使编译器在重新编译的时候只重编译最新改动过的函数和只对最新类定义改动过的源文件进行重编译,以提高编译速度
*.pdb:全称是Program DataBase,即程序数据库文件,用来记录调试信息
*.dsp:(全称是Developer Studio Project)也是一个配置文件
*.ncb:(全称No Compile Browser)的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成
*.plg:实际上是一个超文本文件,可以用Internet Explorer打开,记录了Build的过程
*.cpp:就是C++源代码文件.
二、具体介绍:
lib是和dll对应的。
lib是静态的库文件,dll是动态的库文件。
所谓静态就是link的时候把里面需要的东西抽取出来安排到你的exe文件中,以后运行 你的exe的时候不再需要lib。
所谓动态就是exe运行的时候依赖于dll里面提供的功能,没有这个dll,你的exe无法运行。
lib, dll, exe都算是最终的目标文件,是最终产物。而c/c++属于源代码。源代码和最终目标文件中过渡的就是中间代码obj,实际上之所以需要中间代码,是你不可能一次得到目标文件。
比如说一个exe需要很多的cpp文件生成。而编译器一次只能编译一个cpp文件。
这样编译器编译好一个cpp以后会将其编译成obj,当所有必须要的cpp都编译成obj以后,再统一link成所需要exe,应该说缺少任意一个obj都会导致exe的链接失败。
obj里存的是编译后的代码跟数据,并且有名称,所以在连接时会出现未解决的外部符号一说。当连成exe后便不存在名称的概念了,只有地址。lib就是一堆obj的组合。
2.理论上可以,但实际中通常用lib。
3.编译器会默认链接一些常用的库,其它的需要你自己指定。
附上lib和DLL的区别
(1)lib是编译时需要的,dll是运行时需要的。
如果要完成源代码的编译,有lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有lib文件和dll文件。
lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。
如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。
但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件。
引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址。
这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。
从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。
B. *.c,*.obj,*.exe,分别是什么程序
.c是程序代码(也就是源文件)是保存你的C代码的文件
.C文件逐个编译后,每个生成对应的.OBJ文件
也就是目标文件,是对应C文件的二进制文件
连接之后,就成了.EXE文件,也就是可执行文件了
也就是你运行的程序
C. 编写c程序后出现一个obj文件和exe文件,他们都是干什么用的阿
.obj是将已将编好的程序编译为汇编语言的文件。
.exe就是将所有的.obj文件连接起来得到的可执行文件!
D. C语言源程序文件名的后缀是.OBJ,经过编译后,生成文件的后缀是什么经过连接后,生成文件的后缀是什么
C语言源程序文件名的后缀是.c。C源程序经过C编译程序编译之后生成一个后缀为.OBJ的二进制文件,
然后由称为“连接程序”的软件,把此.OBJ文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行文件。
由高级语言编写的程序称为“源程序”,把由二进制代码表示的程序称为“目标程序”。为了把源程序转换成机器能接受的目标程序,这时我们需要具有翻译功能的软件--“编译程序”。每种高级语言都有与它对应的编译程序。
(4)c程序编译obj是什么文件扩展阅读
1、目标文件的扩展名为“.obj”(Windows)或“.o”(Linux)。目标文件已经是机器指令,但还不能运行,因为目标文件还没有解决函数调用问题。
2、可执行文件的扩展名为“.exe“。
E. C语言执行过程生成的三种文件和扩展名
用C语言编写的程序成为C语言源程序,源程序文件的扩展名为“.c”。
源程序经编译生成目标文件(".obj")。
把目标文件与各种库函数连接起来,生成可执行文件(“.exe”).
C语言程序可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。
(5)c程序编译obj是什么文件扩展阅读:
C语言是面向过程的编程语言,用户只需要关注所被解决问题的本身,而不需要花费过多的精力去了解相关硬件,且针对不同的硬件环境,在用C语言实现相同功能时的代码基本一致,不需或仅需进行少量改动便可完成移植。
这就意味着,对于一台计算机编写的C程序可以在另一台计算机上轻松地运行,从而极大的减少了程序移植的工作强度。
C语言既有高级语言的特点,又具有汇编语言的特点;既是一个成功的系统设计语言,又是一个实用的程序设计语言;既能用来编写不依赖计算机硬件的应用程序,又能用来编写各种系统程序;是一种受欢迎、应用广泛的程序设计语言。
F. C语言中的obj
obj文件是目标文件,一般是程序编译后的二进制文件,在通过链接器和资源文件链接就成exe文件了。
OBJ只给出了程序的相对地址,而EXE是绝对地址。
OBJ文件不支持有孔的多边形面。
举个例子说明一下:
选择Maya的创建多边形工具(Polygons -> Create Polyon Tool),在视图中画一个四边形,不要按回车,按Ctrl在四边形中间点一下,可以继续在四边形中挖一个洞。把这个有孔的多边形存成OBJ格式,在导入Maya时,会发现多边形少了一块。如果你把这也看成错误,现在至少你已经知道错误的原因了,就是OBJ文件不支持有孔的多边形面。
OBJ文件 -- 实际问题:
现在来讨论一点比较实际的问题吧,就是一旦你遇到了一个出错的OBJ文件,倒底该怎么办?
当你打开OBJ文件后,往往会看到有几万行的代码,你恐怕还没本事情一眼看出错误所在行,除非程序的错误信息中已经告诉你错误行。如果你不知道错误在哪里,可以用排除法,弄清楚肯定正确的代码范围,通过缩减错误代码范围定位错误。例如,你先新建一个空的OBJ文件,把有错的OBJ文件代码粘贴一半过来,然后把这个只有一半代码的新OBJ文件导入Maya。如果这时没有错误信息,说明错误行是在另一半代码中,可以从另一半代码中再粘贴一部分代码试试看;如果这时出现错误,说明错误行就在粘贴的代码中,可以把粘贴过来的代码删去一部分再试试看。就这样,逐步缩减范围直到找到错误行为止。
这种方法虽然很麻烦,不过颇为有效。如果你不会编程,又遇到非常紧急的情况,这种方法还是值得一试的。
OBJ文件 -- 细节:
掌握了这么多差不多也够用了,不过由于网上详细讲解OBJ文件的中文文档很少,我还是再讲一些例子,给大家提供多一点的信息吧。
简单的OBJ格式写法。
# Simple Wavefront file
v 0.0 0.0 0.0
v 0.0 1.0 0.0
v 1.0 0.0 0.0
f 1 2 3
面可以使用负值索引,有时用负值索引描述面更为简便。
"f -4 -3 -2 -1"这句索引值"-3"表示从"f"这行往上数第3个顶点,就是"v -0.500000 0.000000 -0.800000",其它的索引值以此类推。 因此与这一行等效的正值索引写法为:"f 1 2 3 4"
v -0.500000 0.000000 0.400000
v -0.500000 0.000000 -0.800000
v -0.500000 1.000000 -0.800000
v -0.500000 1.000000 0.400000
f -4 -3 -2 -1
OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。
材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。
"usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。
G. C语言源程序文件的后缀是什么,经过编译后生成文件的后缀是什么经过连接后生成文件的后缀是什么
C语言源文件后缀名是.c,编译生成的文件后缀名是.obj,连接后可执行文件的后缀名是.exe。
源文件的后缀仅仅是为了表明该文件中保存的是某种语言的代码(例如.c文件中保存的是C语言代码),这样程序员更加容易区分,编译器也更加容易识别,它并不会导致该文件的内部格式发生改变。
(7)c程序编译obj是什么文件扩展阅读
C语言是一种结构化语言,它有着清晰的层次,可按照模块的方式对程序进行编写,十分有利于程序的调试,且c语言的处理和表现能力都非常的强大。
依靠非常全面的运算符和多样的数据类型,可以轻易完成各种数据结构的构建,通过指针类型更可对内存直接寻址以及对硬件进行直接操作,因此既能够用于开发系统程序,也可用于开发应用软件。
C语言是普适性最强的一种计算机程序编辑语言,它不仅可以发挥出高级编程语言的功用,还具有汇编语言的优点。
H. c 语言编译后产生的obj文件是做什么的
简单的说就是目标代码.
obj文件是单独的目标文件,它还不能单独运行.需要把相关的obj文件连接到一起,才能产生可执行文件.
I. 计算机中OBJ是什么意思
obj是目标文件的意思。目标文件用以存放目标代码和由编译器或汇编器生成的相关数据的计算机文件格式称为目标文件格式。目标文件格式有许多不同的种类。最初每种类型计算机都拥有自身独特的格式,但随着Unix和其他可移植操作系统的问世。
操作步骤/方法
1 obj是目标文件的意思。
2 目标文件用以存放目标代码和由编译器或汇编器生成的相关数据的计算机文件格式称为目标文件格式。
3 目标文件格式有许多不同的种类。最初每种类型计算机都拥有自身独特的格式,但随着Unix和其他可移植操作系统的问世,人们定义了例如COFF和ELF这些格式,并在不同的系统上使用它们。通常,链接器的输入和输出使用相同的文件格式,库文件和可执行文件格式也是一样使用相同的格式。
4 设计或选择一种目标文件格式是计算系统整体设计的关键部分。它影响着链接器的性能并因此影响着程序员在开发时的总耗时;如果格式是用于可执行文件,那么格式的设计还会影响程序的开始运行花费的时间,以及影响到系统对用户请求的反应速度。大部分目标文件格式以区块的方式来组织,每一区块中都装载着同种数据。在虚拟内存系统需要这些块的时候,它可以通过将这些块分页后调入,无需进一步地处理就可使用。
J. c语言中的动态链接和静态链接生成的obj文件是什么意思
obj文件时目标文件,是源文件被编译后生成的文件简单地讲动态链接就是运行时的链接,静态链接就是编译时的链接/