c语言编译生成的.obj文件解释下

c语言编译生成的.obj文件解释下,第1张

c语言编译生成的.obj文件是一种文本文件,程序编译时生成的中间代码文件目标文件,一般是程序编译后的二进制文件,再通过链接器和资源文件链接就成可执行文件了。OBJ只给出了程序的相对地址,而可执行文件是绝对地址。

obj文件基本结构:OBJ文件不需要任何种文件头(File Header),尽管经常使用几行文件信息的注释作为文件的开头。

OBJ文件由一行行文本组成,注释行以符号“#”为开头,空格和空棚芹行可以随意加到文件中以增加文件的可读性。有字轮和返的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。

扩展资料:

C编译的整腊饥个过程很复杂,大致可以分为以下阶段:

1、预处理阶段

在该阶段主要完成对源代码的预处理工作,主要包括对宏定义指令,头文件包含指令,预定义指令和特殊字符的处理,如对宏定义的替换以及文件头中所包含的文件中预定义代码的替换等,总之这步主要完成一些替换工作,输出是同源文件含义相同但内容不同的文件。

2、编译、优化阶段

编译就是将第一阶段处理得到的文件通过词法语法分析等转换为汇编语言。优化包括对中间代码的优化,如删除公共表达式,循环优化等;和对目标代码的生成进行的优化,如如何充分利用机器的寄存器存放有关变量的值,以减少内存访问次数。

3、汇编阶段

将汇编语言翻译成机器指令。

参考资料来源:百度百科-c语言

这是tuboc c++软件编译生成的文件

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"来指定新的材质。

OBJ文件是十六进制目标文件格式,是C语言在编译时的中间文件,OBJ文件虽然是二进制文件,但还要把OBJ文件Link为EXE文件才能运行?这里的知识就比较多了,这里不能多讲。但是要明白一点,在DOS下仅仅有了一个二进制文件还不能运行,因为 *** 作系统要把这些二进制文件加以规划,把相应的数据、程序代码放到应该放的内存位置,这样吵帆派的经过严密规划和组织好了的二进制文升贺件才能运行。而这些只有在生成的EXE文件里面才做完了这些工作。

在Delphi中直接链接C语言的OBJ文件.

这种方法的好处在于最终EXE不用带任何外部文件.也不用对C语言过于熟悉.

我们都知道,代码在编译成可执行文件(或DLL,OCX文件,下同)之前,都必须得先生成OBJ文件(DELPHI一般是DCU文件,但也可以通过编辑编译选项生成OBJ文件),然后把OBJ文件和资源文件(*.RES)链接成最终的可执行文件.利用这个方法,我们可以在Delphi中直接把OBJ文件链接到我们的程序里面.

不过需要注意的是,编译器不同,生成的OBJ文件也不一样.Microsoft的编译器生成的OBJ文件是COFF格式,而Borland的C++Builder生成的是OMF格式.因为我们需要在Delphi中链接,所以必须使用CBC,或者Borland官方站点带的免费编译工具.下面我们通过一个简单的例子来说明具体 *** 作步骤:

这个例子是简单的提供一个函数,用来判断一个文件是否为Dat格式的VCD文件.头文件声明如下:

以下是引用片段:

/*

文件名称:DatFormat.h

*/

#ifndef DatFormat_H

#define DatFormat_H

#include

#pragma pack(push, 1)//这个与下面的配对,一般用到记录类型的时候需要定义,这里实际不用

#ifdef __cplusplus

extern "C" {

#endif

extern BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile)

#ifdef __cplusplus

}

#endif

#pragma pack(pop)

#endif // DatFormat_H

具体实现代码DatFormat.c如下:

#include "DatFormat.h"

BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile)

/*

函数说明:该函数用于判断一个文件是否为Dat文件(即VCD文件)格式.

参数:

IN:

FileName:欲判断的文件名称

IN,OUT:

IsDatFile:是否为Dat格式文件

OUT:

读轿樱文件失败返回FALSE,否则返回TRUE.

------------------------------------

*/

{

HANDLE hFile

DWORD dwBytesRead

BOOL re

char MyBuf〔4〕

*IsDatFile=FALSE

//建立读文件句柄

hFile = CreateFile(FileName,

GENERIC_READ,

FILE_SHARE_READ,

NULL,

OPEN_EXISTING,

0,

0)

if (hFile == INVALID_HANDLE_VALUE) return FALSE

//读文件

re = ReadFile(hFile,

&MyBuf,

4,

&dwBytesRead,

NULL)

if (dwBytesRead!=4)

{

CloseHandle(hFile)

return FALSE

}

//读文件失败的时候

if (re!=TRUE)

{

CloseHandle(hFile)

return FALSE

}

CloseHandle(hFile)

*IsDatFile=(MyBuf〔0〕=='R' &&MyBuf〔1〕=='I' &&MyBuf〔2〕=='F' &&MyBuf〔3〕=='F')

return(TRUE)

}

运行CBC,新建一个工程,然后把DatFormat.c添加到工程里面,编译整个工程,将得到我们需要的OBJ文件:DatFormat.OBJ.然后我们关闭CBC即可,因为下面不再需要用到它了.

运行Delphi,新建一个工程并保存.然后把DatFormat.OBJ拷贝到它的目录之下.在单元的implementation下面添加如下代码:

{$LINK 'DatFormat.obj'} //链接外部OBJ文件

function _CheckIsDatFile(const FileName:PcharIsDatFile:PBool):Boolcdeclexternal//定义函数.其中cdecl进栈方式说明采用C语言格式传递参数.external说明是个外部声明函数.

注意函数声明的原形与C定义的不一样.必须在前面添加一个下划线.原因是因为编译器的链接符号中.C与C++是不一样的.因为这个不是本文重点,所以这里不作讨论.请感兴趣的朋友自行参阅相关资料.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12332914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存