编译链接
c/c++ 编译链接知识
leon.liao
这个作者很懒,什么都没留下…
展开
-
GUN编译器(gcc/g++)- 编译过程
【代码】GUN编译器(gcc/g++)- 编译过程。原创 2023-12-08 21:30:03 · 522 阅读 · 0 评论 -
自动化构建 - make&Makefile - recipe 执行原理
背景在Makefile recipe中执行另外一个目录下的Makefile,图简单使用了cd命令,但是测试发现cd命令未生效,示例代码如下:test: cd workspace make cd -常规做法是使用-C选项,如下,test: make -C workspace以上代码首先会切换到workspace目录,再执行此目录下的Makefile,且会有以下打印,workspace下的Makefile执行完后,会切换回原来的目录和Makefile。原创 2022-03-10 20:51:09 · 381 阅读 · 0 评论 -
自动化构建 - cmake - 构建目标类型 - Debug,Release,RelWithDebInfo,MinSizeRel
说明软件项目构建的目标程序为了标识不同的用途,时常会有Debug版本,Release版本等区分;使用cmake构建工具,CMAKE_BUILD_TYPE选项是实现该区分的标准接口。cmake支持四种构建类型:Debug;调试版本Release;正式版本RelWithDebInfo;既优化又能调试的版本MinSizeRel;最小体积版本使用类型选择构建时可以通过以下方法,选择不同的构建类型。在CMakeLists.txt中设置,代码如下:SET(CMAKE_BUILD_T原创 2021-03-27 16:52:08 · 7379 阅读 · 0 评论 -
编译原理 - 栈变量地址分配
说明变量地址在编译期就由编译器确定了(栈变量也一样,不同的是栈变量确定的是栈偏移),程序运行时才做真正的内存分配。栈空间由高地址往低地址分配。问题编译器处理栈变量地址分配有什么规则?后续测试,测试环境如下:Linux : gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4windows : Code::Blocks 17.12 普通局部变量int main(int argc, char **argv){ int a; char b; int原创 2020-07-04 11:53:01 · 1225 阅读 · 0 评论 -
编译原理 - 空类或空结构体对象内存占用
说明对于空类或空结构体生成的对象,内存占用如何?编译器是如何处理的?空类如下空类,生成的对象大小为1,不为0。#include <iostream>using namespace std;class EmptyClass {};int main(int argc, char **args) { EmptyClass n; cout << sizeof(n) << endl; return 0;}* 运行结果:原创 2020-06-19 20:44:11 · 808 阅读 · 0 评论 -
编译工具 - GUN编译器 - 去掉未使用的函数
说明在公司做嵌入式产品开发时,需要想办法减少系统资源占用,由于以下原因,想去掉未使用的函数。嵌入式设备资源非常不足,当时只有128M内存,flash只有16M,并且公司要求资源减半,做costdown产品。公司员工经验不足,编码习惯不好,以及考虑扩展,定义了很多空函数和未使用的函数。链接的库,为了通用,写的比较完善,有很多接口,但是很多只使用到了部分接口。优化尝试库经过学习以及测试验证得到结论:静态库链接时只会将使用到的中间文件链接进程序,不会链接所有文件,因此库文件大小不重要原创 2020-05-08 21:01:20 · 1019 阅读 · 0 评论 -
编译原理 - 变量的内存地址和符号地址
变量地址引子访问局部变量时,程序如何知道变量的内存地址?如下:int a;a = 10;理解保存在data,rodata等分区的变量,内存地址在编译期就能确定,通过变量名的访问可以由在编译期将变量名映射为变量的内存地址来实现;但是局部变量和指针变量不同,其内存地址是不断变化的,每次执行都不同。事实上所有的变量的地址都是在编译阶段确定下来了的,包括局部变量和指针变量本身,编译期...原创 2020-05-05 20:33:05 · 5817 阅读 · 3 评论 -
编译工具 - GUN编译器 - 编译优化
说明使用GUN编译器编译时可以设置优化等级,编译器会去优化生成的程序。优化等级优化等级从低到高如下:–O0 : 禁止编译器进行优化。-O1 :尝试优化编译时间和可执行文件大小等。-O2 :会进行部分优化,但不进行循环展开和函数内联等操作。-Os : 可以看成 -O2.5,优化代码尺寸的,给一些CPU缓存或是磁盘空间小的机器使用。-O3 :会进行循环展开,分支预测,函数内联...原创 2020-04-22 11:04:56 · 743 阅读 · 0 评论 -
编译链接 - 库
简介库是实现代码复用的官方方式,相对于其它方式,库是二进制形式更安全,更独立。库有以下两种:动态库静态库其它代码复用的方法代码形式编译时产生的中间文件:.o文件中间文件也可以代码复用,链接进程序,但是直接使用中间文件不方便,太零碎,静态库是在中间文件的基础上实现的一种代码复用方式。静态库静态库本质上只是将中间文件打包在一起,链接时链接单位依然是中间文件,链...原创 2020-04-15 21:47:05 · 293 阅读 · 1 评论 -
编译原理 - 代码行,块界定
问题以下代码输出是什么?if (1) printf("1"),printf("2"),printf("3");众所周知if语句没使用 大括号的话作用域只有一行,怎样算一行?问题的本质是:对于编译器而言如何界定代码行和代码块?不管是编译型语言还是解释型语言,处理的对象(代码)都是字符串形式的,编译器和解释器处理代码时是如何界定的一行代码和一块代码?编译器和解释器并不一定是按照...原创 2020-02-15 20:20:05 · 306 阅读 · 0 评论