什么是编译、什么是连接。C++代码如何变成机器码,如何跨平台和嵌入式嵌入式开发
什么是编译、什么是连接。C++代码如何变成机器码,如何跨平台和嵌入式?
坑,未填完
1、编译和连接是两个过程。前者是将源码变成机器码。后者是将机器码组织起来,形成一个可执行文件;组织的过程中,需要用到从源码的来的机器码,以及被调用的系统标准库,和动态连接库。
![](https://www.0419af.com/wp-content/uploads/2023/02/1675242470-46a309f1022ff0c.png)
2、什么是动态连接库呢?
非人话:
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll”、”.ocx”(包含ActiveX控制的库)或者 “.drv”(旧式的系统驱动程序)。
动态链接库文件,是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需的代码和其他资源。
人话:如何通俗得理解动态链接库。 动态库和静态库。动态库的存在是为了解决静态库的问题。动态库和静态库的区别在于,连接阶段如何处理库。库就是可执行代码的二进制形式;
Linux 中的动态链接库和静态链接库是干什么的? – 知乎
![](https://www.0419af.com/wp-content/uploads/2023/02/1675242472-46a309f1022ff0c.png)
![](https://www.0419af.com/wp-content/uploads/2023/02/1675242474-46a309f1022ff0c.png)
什么是dll:
动态链接库在工作时的工作原理:
dll只是一组源代码的模块,每个模块包含一些可供应用程序或者其他dll调用的函数,在应用程序调用一个dll里面的函数的时候,操作系统会将dll的文件映像映射到进程的地址空间中,这样进程中所有的线程就可以调用dll中的函数了
dll加载完成后,这个时候dll对于进程中的线程来说只是一些被放在地址进程空间附加的代码和数据,操作系统为了节省内存空间,同一个dll在内存中只有一个,也就是说如果你的的两个应用程序都需要加载user32.dll,那么操作系统也只会加载一次user32.dll到内存中
因为代码段在内存中的权限都是为只读的,所以当多个应用程序加载同一个dll的时候,不用担心应用程序会修改dll的代码段。当线程调用dll的一个函数,函数会在线程栈中取得传递给他的参数,并使用线程栈来存放他需要的变量,dll函数创建的任何对象都为调用线程或者调用进程拥有,dll不会拥有任何对象,也就是说如果dll中的一个函数调用了VirtualAlloc,系统会从调用进程的地址空间预定地址,即使撤销了对dll的映射,调用进程的预定地址依然会存在,直到 用户取消预定或者进程结束
2、什么是toolchain
g++,结合参数,能够生成.obj文件,.exe文件
3、Cmake是干什么用的,基本语法是啥?
5、编译,汇编,连接。是三个过程。
编译,生成了asm文件
汇编,生成了obj文件
连接,生成了exe文件;
一些零碎的基础知识;
1、Keil 写51单片机的IDE; 2、CodeWarrior 写NXP(k60或者xs128)的IDE; 3、下载器(ST-Link/J-Link)
========================基础知识======================== 1、OpenOCD是用于对STM32进行下载仿真的工具 2、STM32CubeMX 干吗用的? 选择芯片用的?。设置中项目名称一定要和在Clion中建立的一致,这样生成的工程文件才会覆盖Clion中的文件。生成的IDE类型选择是SW4STM32。每次修改完点Generate之后,弹窗直接点Close,Clion里面会自动更新文件。 3、MinGW干嘛用的?MinGW,是Minimalist GNU for Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。 可以理解成window的编译器组件; 4、arm-none-eabi-gcc干嘛用的?https://blog.csdn.net/ybhuangfugui/article/details/109733331 可以看到 这个玩意属于GNU Arm嵌入式工具链 5、Clion创建嵌入式Project时,会生成一个.ioc文件,这个文件跟使用STM32CubeMX直接创建的是一样的。这个.ioc文件描述了“使用的芯片型号是啥(STM32F030F4Px)”。 6、在Clion中,配置好后,就可以进行编译,下载,调试; 7、下载程序时,需要指定使用的下载器,如J-Link、ST-Link、CMSIS-DAP等。Clion烧录程序之前通用需要进行一些设置。在OpenOCD中,Edit,Configurations,生成自己的config.cfg文件,里边配置“前两行设置了仿真器的类型和接口,下面几行指定了Flash大小、芯片类型、下载速度等。” 8、CLion中组织编译规则都是基于CMakeLists.txt 9、Cmake中,// *.*表示通配符,也就是这个文件夹里的所有文件都会被编译 10、GCC 是 GNU 推出的功能强大、性能优越的多平台编译器,是 GNU 的代表作品之一。 11、早期的GCC主要针对于C语言,随着编程的发展,现在不仅支持C语言,还支持其他很多语言,包括 C++、Ada、Objective-C、Fortran 和 Java 等。 12、GCC 的意思被重新定义为“GNU Compiler Collection”,也即“GUN 编译器套件”。 13、GCC受到广大软件开发者的喜欢,有一个很重要的原因就是免费。你会发现一个问题,很多开源的IDE,基本上集成的编译器都是GCC,比如STM32CubeIDE、RT-Thread Studio等。 14、“GNU Arm嵌入式工具链”,是ARM 官方推荐的一套工具,主要是针对32位Arm Cortex-M、 Cortex-R和Cortex-A系列处理器的一套工具链。 15、“GNU Arm”包括GNU编译器(GCC),可直接从Arm免费获得,用于Windows,Linux和Mac OS X操作系统上的嵌入式软件开发。 https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads
如何理解ARM、STM32、51单片机,Intel之间的关系?
1、STM32是使用了ARM核的MCU; 2、其实除了STM32,ARM核的使用范围很广,TI与Freescale也有使用ARM核的MCU与SOC。我们通常把使用ARM核作为核心运算功能的片上系统叫做ARM芯片,于是对ARM芯片的开发,就是题主所说的ARM编程。 4、由于ARM芯片在使用上其实大同小异,同时STM32芯片推荐使用的KEIL开发套件使用起来很好上手,所以题主通过使用STM32来入门ARM编程也是很好的。 5、常用的集成开发环境有IAR和Keil,官方教程多用IAR,国内多用Keil。 6、开发驱动。STM32官网能够下载官方驱动Demo, 7、开发应用。这里已经和MCU或者ARM没有太多关系,随便怎么写软件都没问题。但是开发时还是要注意,与windows上的软件开发有很大区别,MCU的资源极其有限,运算速度也相对慢很多,要时刻注意内存溢出、延时、公共资源被占用等问题。 8、驱动和应用其实说到底是人为的划分,为了方便项目分工合作以及平台间移植,人为将和MCU相关的代码定义为“驱动”,而将与MCU关系不大并且主要是用来实现功能和特性的代码定义为“应用”。“驱动”和“应用”在不同的.c和.h文件中编写,驱动用来控制MCU中的硬件模块工作,应用通过调用驱动的接口来实现对MCU的控制。 9、”ARM编程”,利用ARM MCU,用汇编、C、python等编程。 10、STM32系列MCU(微控制器)只是ST公司设计的MCU,是众多采用ARM架构的MCU的其中一种,其它公司也有很多采用ARM架构的MCU。
11、Intel和AMD 与 x86,ARM,MIPS有什么区别? 12、amd和Intel这俩公司的渊源很深,早期时Intel先是自己搞了个x86架构,然后amd拿到了x86的授权也可以自己做x86了。接着intel向64位过渡的时候自己搞了个ia64(x64架构)但是因为和x86架构不兼容市场反应极差,amd率先搞了x86的64位兼容(32和64的混合架构)也就是后来的x86-64,后来Intel也拿到了生产这货的授权(i和a两家专利交叉的很严重),也搞了x86-64,因为amd先搞出来的所以x86-64也叫amd64; 13、目前amd和Intel是世界上最大的两家x86和x86-64的cpu厂家(intel比较给力,四分天下有其三)。
14再说x86,arm和mips 15、早期的cpu有两个设计思路,1是把cpu内的逻辑电路做的非常复杂,这样可以直接用cpu硬件实现复杂指令,这个叫复杂指令集cisc;另一个思路是尽可能把cpu做的简单,依靠简单指令的组合迭代完成复杂指令,这个叫精简指令集risc。 16、x86目前泛指x86和x86-64架构,这是因为x86-64完全兼容x86。早期的x86是cisc的代表,后来的发展中逐步引入了risc的部分理念,将内部指令的实现大量模块化,准确来说是一个cisc外加risc部分技术的架构。 17、目前x86的主要产品有Intel的至强,酷睿,奔腾,赛扬和凌动;amd的锐龙,apu等。上文提到的x64架构目前只有intel 安腾而且已经放弃了产品线。 18、到目前为止intel和amd的x86架构cpu虽然指令集上有很大差别了但是还是相互兼容的,所以软件可以直接用。 19、再说arm。arm是risc的典型代表,不过在arm的发展过程中引入了部分复杂指令(完全没有复杂指令的话操作系统跑起来异常艰难),所以是一个risc基础外加cisc技术的cpu。
除了上述几家,还有power cpu(risc的,老苹果用的就是这货);alpha架构的cpu(侧重超算,目前貌似最活跃是中国申威,神威太湖之光的cpu就是这货)。
我梳理的框架:
============