首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C代码 从源代码到可执行文件——编译全过程解析

程序生命周期从一个高级C语言程序开始,这种形式能够被人读懂,却不能被机器读懂,为了系统运行这个程序,该源程序需要被其他程序转化为一系列低级机器语言指令,然后将这些指令按照可执行目标程序格式打包并以二进制磁盘文件形式存储起来...Linux系统下,可用以下指令完成源程序到目标程序转化: gcc -o hello hello.c main.c gcc 编译驱动程序读取源文件hello.c和main.c,经过预处理、编译、汇编...编译 编译(CCL)将经过预处理处理得到文本文件hello.i和main.i翻译成hello.s与main.s,其中包含了汇编语言程序,汇编语言程序以一种标准文本格式确切描述一条低级机器语言指令...汇编 汇编(AS)将hello.s和main.s翻译成机器语言指令,并打包成可重定位目标程序,一般以.o为文件扩展名。可重定位目标程序二进制文件,它字节编码机器语言指令而不是字符。...运行以下指令可得到重定位目标程序main.o和hello.o: gcc -c main.s hello.s 用文本编辑打开main.o和hello.o发现文件乱码,因为此时已经二进制文件。

2K50

关于opentelemetry-cpp社区对于C++ Head Only组件单例和符号可见性讨论小记

Windows下,有且只能有一个模块代码实现把 OPENTELEMETRY_SYMBOL_EXPORT 声明为 __declspec(dllexport) ,其他模块声明为 __declspec(import...只有一个模块有实现,其他模块都是导入这个模块实现,否则链接时会报重定义。所以这个申明必须位于 cpp 文件中,不能位于头文件中。...同时Windows下 GCC/Clang 中,也有对应选项 __attribute__((selectany)) (注意 selectany 只能用于变量,不能用于函数)。...虽然C++ 11规定函数内static变量初始化必须线程安全,但是GCC和Clang都是通过一个atomic操作去判定是否初始化。...另一个更大问题,对全局变量初始化会直接写进模块初始化函数,这会导致如果多个模块引用同名全局变量,虽然符号地址走GOT统一了,但是构造和析构函数会执行多次。

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

延时队列我项目里怎么实现

肯定要判断时间啊,不判断时间怎么知道我要延迟消息什么时候执行。明白了这点之后,我们再来别的方案。因为在生产环境中不太可能使用 JDK 原生延迟队列,它是没有持久化,重启就会导致数据丢失。...当 austin 项目使用内存队列去解耦处理数据已经有人提出服务器重启时候该怎么办,我解决思路就是通过优雅关闭服务这种手段去尽量避免数据丢失,而延迟队列这种就不能这么干了,我们等不了这么久。... austin 项目使用消息队列 Kafka,而 Kafka 官方没有提供延迟队列这种机制。...总结这篇文章主要讲述了如果我们要使用延时队列,我们可以有什么方案,他们设计怎么。...需求侧看,这个需求就是「延时队列」场景,但基于现状系统架构和开发成本考虑,我们可以用另类(分布式定时任务框架)方式去把需求给实现了。

69540

Java 虚拟机:JVM怎么实现invokedynamic?(

方法句柄概念 方法句柄一个强类型,能够被直接执行引用 [2]。该引用可以指向常规静态方法或者实例方法,也可以指向构造或者字段。...正确调用方式将该 String 显式转化为 Object 类型。 普通 Java 方法调用中,我们只有选择重载方法时,才会用到这种显式转化。...碰到被它注解方法调用时,Java 编译会根据所传入参数声明类型来生成方法描述符,而不是采用目标方法所声明描述符。...那么前面那个适配器中优化又是怎么回事?实际,方法句柄一开始持有的适配器共享。当它被多次调用之后,Invokers.checkCustomized 方法会为该方法句柄生成一个特有的适配器。...因此,它也会面临无法内联问题。不过,与反射调用不同,方法句柄内联瓶颈在于即时编译能否将该方法句柄识别为常量。具体内容我会在下一篇中进行详细解释。

93630

vscode配置c语言环境

装完系统之后最麻烦的当然就是所有学习资料安装恢复了。这样工作对我这种记忆力不大好“老年人”极度不友好!可是这又有什么办法呢,找到了我云盘学习资料后,当然安装对应工具了。...我首先选择恢复vscode这款神器,我感觉这款轻量编辑还是对我挺友好,各个系统平台都可以使用,支持多种语言不说,还有丰富多样各类插件免费使用。...+shift+x)搜索框中输入chinese,然后我们点击第一个简体中文下install,等待下载完成后重启vscode就可以看到汉化后页面了。...然后我们继续安装以下两款插件C/C++以及Code Runner 第二步:安装编译MinGW-W64 GCC) 由于官网下载地址需要科学上网访问国外网站。...然后摁住win+R键输入cmd,cmd控制台输入下方代码并回车,当输出结果如图所示就是成功了 gcc -v -E -x c++ - 第四步:配置vscode 最后我们配置vscode相关配置

1.3K20

【vscode】配置c++环境

前言 vscode本身并不能编译运行c++项目,但是我们可以通过安装一些插件并进行一些配置来使其适合开发小型c++项目。 安装c++相关插件 扩展侧栏搜索c++,安装如下插件。...C/C++ C++ Intellisense Include Autocomplete 安装mingw mingw推荐从source_forge网站下载,mingw全版本下载下载mingw,建议版本x86...命令行输入gcc -v,出现类似如下结果说明安装成功。 测试mingw安装完成 配置task.json { // See https://go.microsoft.com/fwlink/?...task命令具体配置参数与含义请参考官方文档 配置launch.json { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性描述。...设置断点,调试侧栏中可观察变量与堆栈。

92721

vscode 配置C语言编译环境(完美版)_C语言环境安装

大家好,又见面了,我你们朋友全栈君。...,那还需要一个编译,很可惜VSCode插件里面不自带,所以要自己下载然后配置; 最后VSCode中进行相关配置,就可以 下载并安装VSCode vscode下载地址 安装相关插件 打卡后进入如下界面...,选择这个C/C++,然后点击install进行安装,大概几秒钟就好了,安装完成后install按钮会变成uninstall(卸载): 安装编译MinGW-W64 GCC) 下载地址 链接:...,单击打开: 然后环境变量中系统变量中,找到Path变量: 打开之后将刚刚复制地址添加进去: 然后点确定,之前弹出所有页面都点击确定。...,将所有的 改为自己安装路径,就是我们之前下载编译地址: 把你MinGW-W64 GCC解压后文件中mingw64地址复制下来,替换代码里所有的 D:/Program Files

2.5K20

如何使用vscode快速配置C语言环境(简单实用)

如图: C语言编译包(MinGW-w64) 一、前面的工作做完后,然后下载MinGW-w64编译工具,这里不推荐下载上面绿色部分在线安装包,比较麻烦,直接下载下面的压缩包,如图所示: 下载完成后解压文件...,可以自行选择目录,我这里选择D盘下软件目录。...; return 0; } 由于没有进行vscodeC语言环境配置,所以会出现很多问题。这里就不一一阐述了,工作目录下建立一个.vscode文件夹用于存储一些配置。...由于我这里C/C++ Compile Run插件里面设置了Run in a new external terminal,所以会弹出新cmd窗口。...我们刚刚写c文件页面,按F6即可运行,运行结果如下: 另外,为了节省大家时间,附上我打包vscode以及mingw64和.vscode地址,有问题欢迎在下方留言!

96410

main函数真的C程序开始吗?

我们在学习和编写C程序时,都是从main函数开始,main函数作为入口函数已经深深地印我们脑海中,那么main函数真的C程序入口函数吗?带着这个问题我们先来看下面一段代码。 1....从运行结果中,我们可以看出来beforeMain进入main函数之前被调用,这对于C语言初学者来说似乎有点难以理解。究竟是谁调用beforeMain呢?...而最终可执行文件除了我们编写这个简单C代码以外,还有大量C库文件参与了链接,并包含在了最终可执行文件中。这个链接过程,由链接ld链接脚本来决定。...构造函数属性使函数执行进入main()之前自动被调用 GNU C一大特色就是__attribute__机制。...__attribute__写法__attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面相应__attribute__参数。

45410

写给小白:浏览断点调试怎么实现

不同操作系统可执行文件格式不同, windows pe(Portable Executable) 格式, linux、unix 系统 elf(Executable Linkable Format...) 格式, mac mash-o 格式。...编译型语言会经过编译、汇编、链接阶段,编译把源代码转成汇编语言构成中间代码,汇编把中间代码变成目标代码,链接会把目标代码组合成可执行文件。这个可执行文件可以操作系统直接执行。...那是因为解释需要编译成机器码,cpu 知道怎么执行解释,而解释知道怎么执行更上层脚本代码,就这样,由机器码解释执行解释,再由解释解释执行上层代码,这就是脚本语言原理。...比如 js 引擎一般就是由 parser、解释、JIT 编译、GC 构成,大部分代码由解释解释执行,而热点代码会经过 JIT 编译编译成由机器码,直接在操作系统执行以提高性能。 ?

1.5K41

没有DOM操作日子里,我怎么熬过来

前言 我动笔写这篇文章时候,我刚刚从我项目中删除了最后一行JQuery代码。至于我为何要这么做,请听闰土娓娓道来。前几年我还在想,假如有一天,前端世界里不能再直接操作dom了,我该怎么办?...然后Vue中,el属性绑定根视图id,data属性定义并初始化v-model、双大括号用到数据和一些其他数据。methods属性定义v-on中用到和一些其他方法。更新界面修改数据实现。...而修改数据通过操作界面实现写完了这个demo后,我感觉到了Vue的确有它魅力所在。它MVVM让业务逻辑变得更加清晰和简单。...JQuery 与 VueJS 相互配合可以非常高效完成异步任务,首先通过 JQuery 发出 Ajax 请求,接收到从服务端传递过来 JSON 数据后,再通过 Vue 将数据绑定到组件,最后由...jQuery本质只是一个简化了操作函数库而已,代表优化过JavaScript dom操作。

2.1K120

开发C语言3款神器,个人觉得第三款用着最香!

下载完成后,我们双击下载软件开始安装 弹出画面点击继续 等待完成然后我们开始配置开发环境 如果没有别的需求这里我们就只选择:使用C++桌面开发 如果不想用默认安装路径(默认安装在C盘...启动后画面如下: 点击创建新项目 选空项目,然后点击下一步 填写项目名称,和项目存放位置,然后点击右下角创建 下面就是我们编写代码画面 源文件右击添加-->新建项,也可以直接使用快捷键...将mingw64解压到指定目录,这个冲哥路径「D:\Tools\mingw64」解压好之后,还需要配置环境变量 将目录「D:\Tools\mingw64\bin」追加到环境变量「path」里 电脑右击...「属性」,再选择「高级系统设置」再点击环境变量 双击「path」 将刚才解压路径追加到环境变量里 接下来需要验证「mingw64」是否配置成功 使用win+R组合键,输入cmd回车 命令行里输入...纯净环境下刚安装好不能运行这段代码(如果之前装了VSC语言环境或者MinGW环境,这里就会自动选用,代码就可以运行),还需要配置编译环境,这里点击File->Settings 如下配置MinGW

1.1K40

开发C语言3款神器,VS2019、VScode和IntelliJ Clion

] 如果没有别的需求这里我们就只选择:使用C++桌面开发 如果不想用默认安装路径(默认安装在C盘),可以点击更改来指定安装路径 [00tirnesfw.png] 选择好安装路径后,右下角安装按钮左边选择下载时安装...,和项目存放位置,然后点击右下角创建 [1fy89cqywp.png] 下面就是我们编写代码画面 [c9z0veza49.png] 源文件右击添加-->新建项,也可以直接使用快捷键ctrl+shift...将mingw64解压到指定目录,这个冲哥路径D:\Tools\mingw64 解压好之后,还需要配置环境变量 将目录D:\Tools\mingw64\bin追加到环境变量path里 电脑右击属性...mingw64是否配置成功 使用win+R组合键,输入cmd回车 [k9mcbqnv1t.png] 命令行里输入gcc -v,输出以下版本信息则表示minGW配置OK [cc6wf1n22v.png]...[numj7cag32.png] 纯净环境下刚安装好不能运行这段代码(如果之前装了VSC语言环境或者MinGW环境,这里就会自动选用,代码就可以运行),还需要配置编译环境,这里点击File->Settings

2K20

GCC中初始化函数怎样被处理

本文译至: http://gcc.gnu.org/onlinedocs/gccint/Initialization.html 如我们所知,GCC通过给代码追加__attribute__((constructor...))和__attribute__((destructor))方式能够追加初始函数和终止函数, 这篇文章介绍了GCC内部怎样实现上述处理。...为了支持初始函数和终止函数,编译必须在汇编代码中生成一些东西来使这些函数合适时间点被调用。当你把编译移植到一个新系统时,你须要去指定怎么去做。...支持.init section(程序启动时运行)系统,crtstuff.c部分内容会被编译到这个section里。...这个程序会假扮为链接GCC 使用;它工作执行正常链接,也管理追加初始函数和终止函数向量,这些函数通过上述 __main 被调用。

45110

Ubuntu Snap 应用商店发现加密货币 ‘恶意软件’ 怎么回事?

对那些不熟悉相关术语的人来说, 加密货币(cryptocurrency) 矿工(miner)一段使用计算机主处理或者图形处理来“挖掘”数字货币程序。“挖矿”通常涉及到解决一个数学等式。...他们“开发非常有趣安全功能,这些功能将会在改善系统安全性同时提升人们服务或桌面上进行软件开发体验”。 其中一个他们正在开发功能查看一个软件发布者是否已通过验证。...当我读到类似空洞描述时,我会多考虑下。 我注意到另一件事软件大小。2048buntu 1.0 版本大小将近 140 MB。一个简单游戏怎么需要这么多空间?...这是一个使用了 Ubuntu 主题流行游戏克隆。它怎么能被认为专有软件?我确信,其他合法开发者会因为该内容而使用了 FOSS (自由开源软件)许可证来上传它。...无疑 Snap 应用商店还有改善空间 在我看来,Snap 应用商店团队应该实现第一个特性报告可疑应用方式。tarwirdur 必须找到该网站 Github 页面才行。

60220

windows下安装C源运行环境

,也没时间,不吐槽了,今天先介绍一下怎么windows下搭建c源环境,让喜欢写c源的人可以运行自己代码,ok,废话不多说了,我们简单说一下怎么搭建!...java需要JDK虚拟机才可以工作,他之所以跨平台很厉害其实也不是它本身优势,而是不同平台都可以安装JDK,JAVA运行在JDK,所以他跨平台很厉害,普及一下常识。...那么c源其实也是一样,c源运行在机器,那么机器我们都知道有一大特点,就是他只能读懂机器码,所以我们写好C源他不可以直接认识,也是通过编译以后才可以。...,我们今天写工具codeblock+Gcc,codenlockc源编辑Gcc运行环境。...MinGw安装 前面我们说了,安装Gcc需要安装MinGw,下面安装MinGw: 下载MinGwMinGw ? ? 安装MinGw: 下载好这个样子: ? 我们安装: ? ? ? ? ?

66630
领券