㈠ c语言生成的目标文件和汇编语言生成的文件有什么区别
汇编语言和二进制代码是有直接对应关系的,也就是说汇编语言在编译时是直接翻译就可以了,不存在优化的问题,所以汇编语言的编译器都相当小。
而c语言在编译时首先进行的是词法分析和语法分析,然后是优化,还会加入版本信息和一些防止溢出的判断,所以编译后的文件相比汇编直接写成的程序要大很多。然后c语言编译后的程序运行时其实是需要C
run-timelibrary的支持的
㈡ C语言中的源程序文件和目标文件的扩展名分别是
C语言源代码文件一般扩展名为.c,目标文件扩展名一般为.obj,生成的可执行文件扩展名一般为.exe。
不同平台的C源代码扩展名都为.c,但目标文件扩展名不同,例如:在Linux平台上,生成的可执行文件一般扩展为.out。
源文件:这是指由源程序和数据构成的文件。通常由终端或输入设备输入的源程序和数据所形成的文件都属于源文件。它通常是由 ASCII 码或汉字所组成的。
目标文件:这是指把源程序经过相应语言的编译程序编译过,但尚未经过链接程序链接的目标代码所构成的文件。它属于二进制文件。
可执行文件:这是指把编译后所产生的目标代码再经过链接程序链接后所形成的文件。
(2)c编译成目标文件扩展阅读:
源文件,目标文件,可执行文件的联系:
源文件就是用汇编语言或高级语言写出来的代码保存为文件,目标文件是指源文件经过编译程序产生的能被cpu直接识别二进制文件。将目标文件链接起来就成了可执行文件。
源代码与源文件:
源代码(也称源程序)是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。 在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。
计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。在大多数情况下,源代码等于源文件。
参考资料来源:网络-源文件
㈢ 请问要用c语言编程,怎么创建目标文件啊
源代码文件可以用任意文本编辑.
目标文件由编译器生成.具体的生成方法在不同的开发环境上是不同的.
gcc的例子:
gcc -o target_file test.c
编译test.c生成可执行文件target_file
gcc -c test.c
编译test.c ,生成目标文件test.o,但不进行link.
㈣ 求将C语言源文件转换成目标文件的源代码,万分感谢!
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
typedef struct pnode //个人记录结点类型
{
char name[8]; //姓名
char tel[16]; //电话号码
char addr[30]; //住址
}personnode;
char filename[20]; //存储通讯录名称数组
FILE *fp;
void creat() //初始输入记录
{
personnode *person;
person=(personnode*)malloc(sizeof(personnode));
printf("\n请输入通讯录名:");
scanf("%s",filename);
printf("---------------------------------------------\n");
if((fp=fopen(filename,"w"))==NULL) //打开文件
{
printf("\n没有输入通讯录名,不能建立通讯录!");
exit(1);
}
fprintf(fp,"%-10s%-20s%-50s\n","姓名","电话号码","住址");
printf("\n请输入姓名,电话号码及住址(以空格隔开,以@结束)\n");
printf("---------------------------------------------\n");
scanf("%s",person->name);
while(strcmp(person->name,"@"))
{
scanf("%s%s",person->tel,person->addr);
fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->addr);
scanf("%s",person->name);
}
fclose(fp);
}
void output() //输出通讯录
{
personnode*person;
person=(personnode*)malloc(sizeof(personnode));
if((fp=fopen(filename,"r"))==NULL)
{
printf("\n不能打开通讯录!");
exit(1);
}
printf("\n*********************************************\n");
printf("%24s\n","通讯录");
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",person->name,person->tel,person->addr);
printf("%-10s%-20s%-50s\n",person->name,person->tel,person->addr);
}
fclose(fp);
printf("*********************************************\n\n");
}
void append() //增加记录
{
personnode *person;
person=(personnode*)malloc(sizeof(personnode));
if((fp=fopen(filename,"a"))==NULL)
{
printf("\n不能打开通讯录!");
exit(1);
}
printf("\n请输入要添加的姓名,电话号码及住址\n");
scanf("%s%s%s",person->name,person->tel,person->addr);
fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->addr);
fclose(fp);
}
void search() //查找记录
{
int k=0;
char namekey[8];
personnode *person;
person=(personnode*)malloc(sizeof(personnode));
printf("\n请输入需要查找的姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("\n不能打开通讯录!");
exit(1);
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",person->name,person->tel,person->addr);
if(!strcmp(namekey,person->name))
{
printf("\n\n已查到,记录为:");
printf("%-10s%-20s%-50s\n",person->name,person->tel,person->addr);
k=1;
}
}
if(!k) printf("\n\n对不起,通讯录中没有此人的记录。\n");
fclose(fp);
}
void dele() //删除记录
{
int k=0;
char m;
long offset1;
char namekey[8];
personnode *person;
person=(personnode*)malloc(sizeof(personnode));
printf("\n请输入要删除记录的姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开通讯录!");
exit(1);
}
while(!feof(fp))
{
offset1=ftell(fp); //P302(C语言),ftell(fp)的值是fp所指文件中位置指针的当前指向
fscanf(fp,"%s%s%s\n",person->name,person->tel,person->addr);
if(!strcmp(namekey,person->name))
{
k=1;
break;
}
}
if(k)
{
printf("\n已查到,记录为:");
printf("%-10s%-20s%-50s\n",person->name,person->tel,person->addr);
printf("\n确实要删除?y/n\n");
scanf("%s",&m);
if(m='y')
{
fseek(fp,offset1,SEEK_SET); //P302,fseek()函数的作用是使位置指针移动到所需的位置,(SEEK_SET即0,头文件)
fprintf(fp,"%-14s%-24s%-48s\n"," "," "," ");
printf("已经删除!\n");
}
}
else
{
printf("\n对不起,通讯录中没有此人的记录。\n");
}
fclose(fp);
}
main()
{
int m,flag=1;
creat();
while(flag)
{
printf("---------------------------------------------\n");
printf("\t\t1---添加\n");
printf("\t\t2---查找\n");
printf("\t\t3---删除\n");
printf("\t\t4---输出\n");
printf("\t\t5---退出\n");
printf("---------------------------------------------\n");
printf("\t请选择(1-6)\n");
scanf("%d",&m);
switch(m)
{
case 1: append();break;
case 2: search();break;
case 3: dele();break;
case 4: output();break;
case 5: exit(0);
}
}
return 0;
}
这是我以前做的一个实验,里面就是把数据输出到目标文件的,没有什么一段代码直接丢到里面去就直接能做好的,认真看下吧,尤其注意person=(personnode*)malloc(sizeof(personnode));
if((fp=fopen(filename,"a"))==NULL);这些语句
㈤ C语言文件的编译与执行的四个阶段并分别描述
开发C程序有四个步骤:编辑、编译、连接和运行。
任何一个体系结构处理器上都可以使用C语言程序,只要该体系结构处理器有相应的C语言编译器和库,那么C源代码就可以编译并连接到目标二进制文件上运行。
1、预处理:导入源程序并保存(C文件)。
2、编译:将源程序转换为目标文件(Obj文件)。
3、链接:将目标文件生成为可执行文件(EXE文件)。
4、运行:执行,获取运行结果的EXE文件。
(5)c编译成目标文件扩展阅读:
将C语言代码分为程序的几个阶段:
1、首先,源代码文件测试。以及相关的头文件,比如stdio。H、由预处理器CPP预处理为.I文件。预编译的。文件不包含任何宏定义,因为所有宏都已展开,并且包含的文件已插入。我归档。
2、编译过程是对预处理文件进行词法分析、语法分析、语义分析和优化,生成相应的汇编代码文件。这个过程往往是整个程序的核心部分,也是最复杂的部分之一。
3、汇编程序不直接输出可执行文件,而是输出目标文件。汇编程序可以调用LD来生成可以运行的可执行程序。也就是说,您需要链接大量的文件才能获得“a.out”,即最终的可执行文件。
4、在链接过程中,需要重新调整其他目标文件中定义的函数调用指令,而其他目标文件中定义的变量也存在同样的问题。
㈥ 我用的TCPP C编译怎样把C文件变成.exe目标文件使用
如果你想从EXE(binary
code,
二进制代码)获取其source
code(源代码),几乎是不可能的,除非用反汇编。但是反汇编也不见得就能得到精确的源代码。如果你是想修改一个EXE文件的Resource的话,比如说icon(图标),description(描述)等,倒是有一些工具。你可以到这个地方去下载:
http://www.thefreecountry.com/programming/resourceeditors.shtml
㈦ c语言编译流程(c语言是如何变成可执行文件的)
1.预编译,把源代码中的宏展开并把包含的文件的源代码插入程序的源代码中.
2.编译,把源代码编译成二进制的目标文件.但是此时目标文件还是不可执行的.
3.汇编,这一步主要是处理源代码中的汇编代码
4.连接,把目标代码和二进制的库文件以及其它内容合并成最终的可执行文件.
㈧ 如何把多个c源文件生成目标文件
1、如果,在一个c主程序中,以include形式包含了其他所有的引用文件,在编译过程中,编译器首先会将这些文件合并到一个临时文件中,然后再对这个临时文件进行编译。
2、如果,是作为一个工程,编译器会分别编译各个独立的文件(如果文件中有include按照上一步进行),然后再将编译好的初步结果用链接程序连到一起。
简单的说,每一个.c或者.cc都是一个编译单元,每一个编译单元编辑的结果是一个.o或者obj之类的中间文件,至于是否是多文件,不需要关心,但是要保证不同的编译单元之间不要有重复的符号,这就是要避免重复包含。
每一个编译单元生成的目标文件.o或者obj都会引用一些不在本目标文件中的符号,这些符号定义在别的.o或者.obj文件中, 链接器把他们联系在一起,所有的符号也就都有定义了,编译链接简单说来就是这样。
㈨ C语言源程序文件经过编译连接之后生成一个后缀为_____的文件。
如果只生成一个文件,那么这个题目答案是B。编译(compile)后生成目标文件,后缀:.obj。也就是机器码。
然后链接器(Linker) 连接生成可执行文件,后缀:.exe。最后运行命令(go),直接运行.exe文件。
(9)c编译成目标文件扩展阅读:
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。
一个现代编译器的主要工作流程:源代码(source code) →预处理器(preprocessor) →编译器(compiler) →目标代码(object code) →链接器(Linker) → 可执行程序(executables)
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。
编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。
源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言。
而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。
对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。
最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。
㈩ C语言执行过程生成的三种文件和扩展名
用C语言编写的程序成为C语言源程序,源程序文件的扩展名为“.c”。
源程序经编译生成目标文件(".obj")。
把目标文件与各种库函数连接起来,生成可执行文件(“.exe”).
C语言程序可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。
(10)c编译成目标文件扩展阅读:
C语言是面向过程的编程语言,用户只需要关注所被解决问题的本身,而不需要花费过多的精力去了解相关硬件,且针对不同的硬件环境,在用C语言实现相同功能时的代码基本一致,不需或仅需进行少量改动便可完成移植。
这就意味着,对于一台计算机编写的C程序可以在另一台计算机上轻松地运行,从而极大的减少了程序移植的工作强度。
C语言既有高级语言的特点,又具有汇编语言的特点;既是一个成功的系统设计语言,又是一个实用的程序设计语言;既能用来编写不依赖计算机硬件的应用程序,又能用来编写各种系统程序;是一种受欢迎、应用广泛的程序设计语言。