展开

关键词

C语言笔记】C语言编译过程

下面以windows环境下test.c为例,test.c代码为: #include <stdio.h> int main(void) { printf("This is a test program \n"); return 0; } 其经历如下过程: ? 如图,编译生成可执行文件过程实际包含四个过程:(1)预处理;(2)编译;(3)汇编;(4)链接。 预处理命令为: gcc -E test.c -o test.i 上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程;-o是指定输出文件名。 预处理之后得到仍然是文本文件。 汇编过程命令为: gcc -c test.s -o test.o 上述命令中-c、-o让汇编器把汇编文件test.s转换成目标文件test.o。 链接过程命令为: gcc test.o -o test.exe 综上,生成可执行程序过程为:预处理、编译、汇编、链接。各个命令如下图所示: ?

45830

C语言编译过程

预处理命令$ gcc -E a.c -o a.i ...省略部分代码 # 2 "a.c" 2 # 1 "head.h" 1 # 3 "head.h" int N=100; void printStr 代表接下来文本应该被当做包含一个隐式extern "C 块 编译 1.高级语言->汇编代码 命令 gcc -S a.i -o a.s .file "a.c" .globl _ 链接 使用到了C标准库东西“printf”,但是编译过程只是把源文件翻译成二进制而已,这个二进制还不能直接执行,这个时候就需要做一个动作,将翻译成二进制与需要用到库绑定在一块。 test.c -L/path -lxxx -o test 动态库的话: gcc -fPIC -shared file1.c -o libxxx.so 也可以分成两部来写: gcc -fPIC file1.c -c //这一步生成file1.o gcc -shared file1.o -o libtest.so

58720
  • 广告
    关闭

    开发者专享福利,1988元优惠券限量发放

    带你体验博客、网盘相册搭建部署、视频渲染、模型训练及语音、文字识别等热门场景。云服务器低至65元/年,GPU15元起

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言编译过程

    如果用一张图来表示: image.png 编译,编译程序读取源程序(字符流),对之进行词法和语法分析,将高级语言指令转换为功能等效汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式要求链接生成可执行程序 如数字、字符串、变量定义,以及C语言关键字,如main,if,else,for,while,{,},+,-,*,\,等等。 经过优化得到汇编代码必须经过汇编程序汇编转换成相应机器指令,方可能被机器执行。 4.汇编过程 汇编过程实际上指把汇编语言代码翻译成目标机器指令过程。 对于被翻译系统处理每一个C语言源程序,都将最终经过这一处理而得到相应目标文件。目标文件中所存放也就是与源程序等效目标的机器语言代码。 目标文件由段组成。 经过上述五个过程C源程序就最终被转换成可执行文件了。缺省情况下这个可执行文件名字被命名为a.out。 老九学堂出品

    62820

    解密C语言编译背后过程

    我们大部分程序员可能都是从C语言学起,写过几万行、几十万行、甚至上百万行代码,但是大家是否都清楚C语言编译完整过程呢,如果不清楚的话,我今天就带着大家一起来做个解密吧。 C语言相对于汇编语言是一种高级语言,要想在系统上运行,需要通过编译器把它转换成机器能够读懂可执行代码。 $gcc -save-temps hello.c –o hello $ls hello hello.c hello.i hello.o hello.s C编译器编译过程主要分成四步: (1) 预处理 2)编译 Compiling 编译将 hello.i 文件编译生成一个中间文件 hello.s,打开可以看到里边都是汇编语言,所以编译作用就是把源代码转换成汇编语言。 ? 到这里 C完整编译流程就结束了,本文示例用是Linux操作系统,编译器用是 gcc,但在其他操作系统,比如 Unix、Windows,或者用其他编译器,原理都是一样,感兴趣同学可以去学习一下编译原理

    19430

    C语言调用mysql存储过程

    int, all_score int ); 存储过程 由括号包围参数列必须总是存在。 IN参数是只传入 OUT参数是只传出 INOUT参数是既传入又传入,即双向传递 指定参数为IN, OUT, 或INOUT 只对PROCEDURE是合法。 (FUNCTION参数总是被认为是IN参数) 建立存储过程,传入平时分x,卷面分y,平时分所占比率pert,学号,课程号;建立过程如下 delimiter // CREATE PROCEDURE cal_grade (x INT,y INT,out t int,pert float,s VARCHAR(8),c VARCHAR(8)) LABEL_PROC: BEGIN IF ( x < 0 || x > 100 AND tno=tn; END LABEL_PROC // delimiter ; C语言调用 #include <stdio.h> include "mysql.h" int main

    15420

    C语言编译全过程剖析

    一、 摘要 C语言编译整个过程是非常复杂,里面涉及到编译器知识、硬件知识、工具链知识都是非常多,深入了解整个编译过程对工程师理解应用程序编写是有很大帮助,希望大家可以多了解一些,在遇到问题时多思考 二、 C语言编译全过程 1) 编译概念: 编译程序读取源程序(字符流),对之进行词法和语法分析,将高级语言指令转换为功能等效汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式要求链接生成可执行程序 经过优化得到汇编代码必须经过汇编程序汇编转换成相应机器指令,方可能被机器执行。 3. 汇编过程 汇编过程实际上指把汇编语言代码翻译成目标机器指令过程。 对于被翻译系统处理每一个C语言源程序,都将最终经过这一处理而得到相应目标文件。目标文件中所存放也就是与源程序等效目标的机器语言代码。 三、 总结 C语言编译整个过程是非常复杂,里面涉及到编译器知识、硬件知识、工具链知识都是非常多,深入了解整个编译过程对工程师理解应用程序编写是有很大帮助,希望大家可以多了解一些,在遇到问题时多思考

    55930

    用gcc编译c语言程序以及其编译过程

    对于初学c语言编程我们来说,学会如何使用gcc编译器工具,对理解c语言执行过程,加深对c语言理解很重要!!! (注意:编译后名字可以随意起,但是呢我们知道预编译后文件还是文本.c文件,所以为了好区分起名字为 xxx.c,这里我们为了显示整个过程,预编译后文件名我们起为xxx.i。) 在c语言中#开头语句又叫预编译指令。例如:#include <stdio.h> 预编译功能之一:会把include包含头文件内容做一个简单替换,即替换到.c文件里面去。 ...... ,即把文本c语言编译为二进制指令。 (注意;用c语言代码依赖库最少,如果使用其他语言依赖库更多哦!!需要装好多包包。)

    54710

    C语言中内存分布及程序运行加载过程

    一个程序内存分配: 下图是APUE中一个典型C内存空间分布图(虚拟内存) ? 可以大致查看整个程序在内存中分配情况: 可以看出,传入参数,局部变量,都是在栈顶分布, 随着子函数增多而向下增长. 函数调用地址(函数运行代码)(高地址) 而malloc分配堆则存在于这些内存之上,并向上生长 全局变量,静态变量都是在分配内存低部存在(低地址) 程序如何装载 1 编译: ? version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xd66ac36636c4fcfcbe395efb6bbd38c053e1c6c7 图1做了简单说明(Linux系统下) ? 左边是UNIX/LINUX系统执行文件,右边是对应进程逻辑地址空间划分情况。

    1.2K80

    更好用excel国际化语言导出

    不知道大家在开发中有没有遇到过『excel导出』需求,反正我最近写了不少这种功能,刚开始利用poi,一行行手动塞数据,生成excel,而且还有国际化需求,比如:标题栏有一列,用户切换成"简体中文"时 exportObjects2Excel(list, Student2.class, true, "学生信息", true, BASE_PATH + "student2.xlsx"); 不过原作者并没有提供国际化语言功能 ,于是顺着这个思路,略为修改了一下,再定义一个多语言注解: /** * 国际化标题注解 * * @author 菩提树下杨过 */ @Retention(RetentionPolicy.RUNTIME |student"]) * * @return 国际化标题配置数组 */ String[] titles(); } 导出地方去判断有无这个注解就行(详细大家可以看源码 "姓名", order = 2) @I18nField(titles = {"en-us|name"}) private String name; ... } 导出时指定语言

    74720

    C语言程序编译成可执行文件过程

    现在我们有一个C语言文件(hello.c): #include <stdio.h> int main() { printf("hello, world! 这个转化过程可分为四个阶段完成。执行这四个阶段程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。 预处理器(cpp)根据字符#开头命令,修改原始C程序。结果就得到了另外一个C程序,通常是以.i作为文件扩展名。 编译阶段。 编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编程序是非常有用,它位不同高级语言不同编译器提供了通用输出语言。 汇编阶段。 hello程序调用了printf函数,它是每个C编译器都会提供标准C库中一个函数。

    1.7K20

    C# WinForm国际化简单实现建议收藏

    对于开发人员而言,在编写程序之前,国际化问题是首先要考虑一个问题,也许有时候这个问题已经在设计者考虑范围之内,但终归要开发人员去做实现。 因此,如何实现国际化,是开发人员必须掌握一项基本技能。 今天,这里要讲就是,在利用C#进行WinForm开发时,国际化是怎么实现。 要在C#中实现国际化,需要相关资源文件,比如要在一个软件中支持英文、中文两种语言,那么就必须有这两种语言资源文件,这在C#中可以采用资源文件(后缀名为.resx)来实现,我们不妨定义英文资源文件名称为 为了适应多处使用情形,这里笔者单独编写了一个类ResourceCulture,该类包含了一些静态方法,主要作用是用来设置当前语言及返回当前语言相关字符串。 1和图2所示: 图1 图2 归结起来,要在C#WinForm中实现国际化,至少需要做好以下几点: (1)准备所需资源文件(如本文中提到英文和中文资源文件); (2)引入命名空间(包括

    9620

    SpringBoot 国际化实现跨地区语言切换

    Kotlin 简介 Kotlin是一门非研究性语言,它是一门非常务实工业级编程语言,它使命就是帮助程序员们解决实际工程实践中问题。 在 JVM 生态不断发展繁荣过程中,也诞生了Scala、Groovy、Clojure 等兄弟语言。 Kotlin 也正是 JVM 家族中优秀一员。 Kotlin是一种现代语言(版本1.0于2016年2月发布)。它最初目的是像Scala那样,优化Java语言缺陷,提供更加简单实用编程语言特性,并且解决了性能上问题,比如编译时间。 我们可以直接访问平台API以及现有的代码库,同时仍然享受和使用 Kotlin 所有强大现代语言功能。 3.扩展函数 Kotlin 类似于 C# 和 Gosu, 它提供了为现有类提供新功能扩展能力,而不必从该类继承或使用任何类型设计模式 (如装饰器模式)。

    1.1K61

    C语言文件操作_C语言调用文件

    大家好,又见面了,我是你们朋友全栈君。 文章目录 文件打开与关闭 文件读写操作 读/写文件中字符串 格式化读写文件操作 文件定位函数 作业使用案例(自己可以全部完成一遍): 文件打开与关闭 C文件操作用库函数实现,包含在stdio.h中。 fread与fwrite 一般调用形式: fread(buffer,size,count,fp ); fwrite(buffer,size,count,fp ); 参数说明: buffer: 要读入数据块存放首地址或要输出数据块起始地址 size: 每个要读/写数据块大小(字节数) count: 要读/写数据块个数 fp: 要读/写文件指针 返回值: 成功,返count值;出错或文件尾,0值。 20190410001"; int age = 17; fprintf(fp, "%s\t%s\t%d\n", name, no, age); fclose(fp); return 0; } 文件定位函数 C语言规定起始位置有三种

    4210

    C语言代码换行_c语言怎么换行输出

    大家好,又见面了,我是你们朋友全栈君 分两种情况: 1. 预处理:把一个预处理指示写成多行要用“\”续行,因为根据定义,一条预处理指示只能由一个逻辑代码行组成。 2. 正常程序:一行写不下:把C代码写成多行则不必使用续行符,因为换行在C代码中只不过是一种空白字符,在做语法解析时所有空白字符都被丢弃了。

    18170

    C语言学习

    文件使用方式  r  只读  rb只读  r+ rb+(不带b为已存在文本文件,带b为二进制文件(binary),带+号为读写文件)  w 只写 wb只写  a 追加  ab追加 二。 说明 1.C语言将计算机输入输出设备都看作是文件。例如,键盘文件、屏幕文件等。ANSI C标准规定,在执行程序时系统先自动打开键盘、屏幕、错误三个文件。 这三个文件文件指针分别是:标准输入stdin、标准输出stdout和标准出错 stderr fclose:文件关闭 fgetc:读取一个字符 fputc:写一个字符到文件中 fgets():从文件中读取一个字符串 fputs():写入字符串到文件中去 fprintf 函数说明:格式化后输出到文件中(与printf函数类似,这里只是参数多了一个文件指针,将格式后结果输出到文件中) fscanf 函数说明:从一个流中执行格式化输入 欢迎大家关注我微信公众号LHWorld

    41220

    C语言起源

    C语言是贝尔实验室Dennis Ritchie于1969年~1973年间创建。 用Ritchie的话来说,C语言是“古怪、有缺陷,但同时也是一个巨大成功”。为什么会成功呢? C语言与Unⅸ操作系统关系密切。 C从一开始就是作为一种用于Unix系统程府语言开发出来C语言设计是由一个人而非一个协会掌控,因此这是一个简洁明了、没有什么冗赘设计。K&R这本书用大量例子和练习描述了完整C语言及其标准库,而全书不过261页。 C语言简单使它相对而言易于学习,也易于移植到不同计算机上。 C语言是为实践目的设计C语言是设计用来实现Unix操作系统。后来其他人发现能够用这门语言无障碍地编写他们想要程序。 C语言是系统级编程首选,同时它也非常适用于应用级程序编写。然而,它也并非适用于所有的程序员和所有的情况。C语言指针是造成程序员困惑和程序错误一个常见原因。

    41200

    C语言和go语言之间交互 - C语言中使用go语言,使用go语言又使用了c语言

    一、go语言中使用C语言 go代码中使用C代码,在go语言函数块中,以注释方式写入C代码,然后紧跟import “C” 即可在go代码中使用C函数 ? 2、import “C” 并没有导入一个名为C包,这里import “C”类似于告诉Cgo将之前注释块中C代码生成一段具有包装性质Go代码 3、访问C语言函数需要在前面加上C.前缀,如C.Cstring C.go_print C.free 4、对于C语中原生类型,Cgo都有对应Go语言类型 如go代码中C.int,C.char对应于c语言int,signed char,而C语言中void* 指针在Go语言中用特殊unsafe.Pointer(cs)来对应 而Go语言string类型,在C语言中用字符数组来表示,二者转换需要通过go提供一系列函数来完成: C.Cstring       char赋值给GoString 3、第8行 go_print调用对应函数 三、C语言中使用go语言,使用go语言又使用了c语言 ?

    1.3K100

    C语言指针

    指针作为参数传递 C语言中,当指针作为函数参数进行传递时,实际上形参和实参指向是同一个地方,例如: /* * @Author: YaleXin * @Date: 2020-06-19 18:02: 53 * @LastEditTime: 2020-06-29 08:59:40 * @LastEditors: YaleXin * @Description: * @FilePath: \my_c_workspace \some_test\pointTest-copy.c * @祈祷不出现BUG */ #include <malloc.h> #include <stdio.h> #include <stdlib.h \some_test\pointTest-copy.c * @祈祷不出现BUG */ #include <malloc.h> #include <stdio.h> #include <stdlib.h after p = modified 但是实际上输出是 after p = (null) 下图给出这个过程中,指针变化: 实际上是因为形参指向区域已经与实参指向不一致。

    8230

    c语言offset_c语言中和%区别

    大家好,又见面了,我是你们朋友全栈君。 今天看libPhenom源代码,看到他们使用JSON解析库参考是Jansson JSON解析库。 malloc了一块指向struct json_object_t地址,但是在将指针返回时候,却并没有将这个分配好内存指针返回,返回是内部一个struct json_t指针。 那这样的话,在需要进行回收内存时候,需要怎么去查找到地址来进行释放呢? ,然后进而来获取整个结构体地址。 exit code: 0 这里struct test里面成员b和c之间偏移量为4是因为结构体将成员存放地址对齐了。

    5330

    C语言常用知识没多少之C语言入门

    C语言自1972年问世以来,历经40多年而不衰。现在依旧在机器语言排行榜中排名前三,可见C语言重要性!C语言既是高级语言,也是少有的面向过程语言。 所以学习C语言过程中可以类比生活中某些问题解决过程去学习,这样有利于C语言学习。 很多没有接触计算机内部(如计算机是如何计算和显示效果等)的人在学习C语言是非常痛苦。 但是却忽略了C语言常用知识是很少!!!近期我会发布几篇关于C语言常用知识讲解,希望能够对大家在学习机器语言过程中有帮助。 一、C语言特性 C语言也像汉语、英语、德语......那样属于一门语言,但是C语言主要是人对机器及计算机进行交流语言。 因为这样电脑无法面对那些不会机器语言的人。所以想看看用键盘输入C语言代码(该过程成为编写代码)结果需要在相应情况下进行(往往称为环境)。

    30630

    相关产品

    • 持续部署

      持续部署

      CODING 持续部署用以管理软件在经过构建之后的发布和部署交付过程,基于 Spinnaker 的 CloudDriver 机制,可以无缝对接多种运维运行时管理工具……

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券