日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

什么是编译、什么是连接。C++代码如何变成机器码,如何跨平台和嵌入式?嵌入式开发

發(fā)布時(shí)間:2023/12/10 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是编译、什么是连接。C++代码如何变成机器码,如何跨平台和嵌入式?嵌入式开发 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是編譯、什么是連接。C++代碼如何變成機(jī)器碼,如何跨平臺(tái)和嵌入式?

坑,未填完

1、編譯和連接是兩個(gè)過程。前者是將源碼變成機(jī)器碼。后者是將機(jī)器碼組織起來,形成一個(gè)可執(zhí)行文件;組織的過程中,需要用到從源碼的來的機(jī)器碼,以及被調(diào)用的系統(tǒng)標(biāo)準(zhǔn)庫,和動(dòng)態(tài)連接庫。

2、什么是動(dòng)態(tài)連接庫呢?

非人話:

動(dòng)態(tài)鏈接庫(Dynamic Link Library 或者 Dynamic-link Library,縮寫為 DLL),是微軟公司在微軟Windows操作系統(tǒng)中,實(shí)現(xiàn)共享函數(shù)庫概念的一種方式。這些庫函數(shù)的擴(kuò)展名是 ”.dll"、".ocx"(包含ActiveX控制的庫)或者 ".drv"(舊式的系統(tǒng)驅(qū)動(dòng)程序)。

動(dòng)態(tài)鏈接庫文件,是一種不可執(zhí)行的二進(jìn)制程序文件,它允許程序共享執(zhí)行特殊任務(wù)所必需的代碼和其他資源。

人話:如何通俗得理解動(dòng)態(tài)鏈接庫。 動(dòng)態(tài)庫和靜態(tài)庫。動(dòng)態(tài)庫的存在是為了解決靜態(tài)庫的問題。動(dòng)態(tài)庫和靜態(tài)庫的區(qū)別在于,連接階段如何處理庫。庫就是可執(zhí)行代碼的二進(jìn)制形式;

Linux 中的動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫是干什么的? - 知乎

什么是dll:

動(dòng)態(tài)鏈接庫在工作時(shí)的工作原理:

dll只是一組源代碼的模塊,每個(gè)模塊包含一些可供應(yīng)用程序或者其他dll調(diào)用的函數(shù),在應(yīng)用程序調(diào)用一個(gè)dll里面的函數(shù)的時(shí)候,操作系統(tǒng)會(huì)將dll的文件映像映射到進(jìn)程的地址空間中,這樣進(jìn)程中所有的線程就可以調(diào)用dll中的函數(shù)了

dll加載完成后,這個(gè)時(shí)候dll對(duì)于進(jìn)程中的線程來說只是一些被放在地址進(jìn)程空間附加的代碼和數(shù)據(jù),操作系統(tǒng)為了節(jié)省內(nèi)存空間,同一個(gè)dll在內(nèi)存中只有一個(gè),也就是說如果你的的兩個(gè)應(yīng)用程序都需要加載user32.dll,那么操作系統(tǒng)也只會(huì)加載一次user32.dll到內(nèi)存中

因?yàn)?strong>代碼段在內(nèi)存中的權(quán)限都是為只讀的,所以當(dāng)多個(gè)應(yīng)用程序加載同一個(gè)dll的時(shí)候,不用擔(dān)心應(yīng)用程序會(huì)修改dll的代碼段。當(dāng)線程調(diào)用dll的一個(gè)函數(shù),函數(shù)會(huì)在線程棧中取得傳遞給他的參數(shù),并使用線程棧來存放他需要的變量,dll函數(shù)創(chuàng)建的任何對(duì)象都為調(diào)用線程或者調(diào)用進(jìn)程擁有,dll不會(huì)擁有任何對(duì)象,也就是說如果dll中的一個(gè)函數(shù)調(diào)用了VirtualAlloc,系統(tǒng)會(huì)從調(diào)用進(jìn)程的地址空間預(yù)定地址,即使撤銷了對(duì)dll的映射,調(diào)用進(jìn)程的預(yù)定地址依然會(huì)存在,直到 用戶取消預(yù)定或者進(jìn)程結(jié)束

2、什么是toolchain

g++,結(jié)合參數(shù),能夠生成.obj文件,.exe文件

3、Cmake是干什么用的,基本語法是啥?

5、編譯,匯編,連接。是三個(gè)過程。

編譯,生成了asm文件

匯編,生成了obj文件

連接,生成了exe文件;

一些零碎的基礎(chǔ)知識(shí);

1、Keil ? 寫51單片機(jī)的IDE;
2、CodeWarrior ?寫NXP(k60或者xs128)的IDE;
3、下載器(ST-Link/J-Link)

========================基礎(chǔ)知識(shí)========================
1、OpenOCD是用于對(duì)STM32進(jìn)行下載仿真的工具
2、STM32CubeMX 干嗎用的? 選擇芯片用的?。設(shè)置中項(xiàng)目名稱一定要和在Clion中建立的一致,這樣生成的工程文件才會(huì)覆蓋Clion中的文件。生成的IDE類型選擇是SW4STM32。每次修改完點(diǎn)Generate之后,彈窗直接點(diǎn)Close,Clion里面會(huì)自動(dòng)更新文件。
3、MinGW干嘛用的?MinGW,是Minimalist GNU for Windows的縮寫。它是一個(gè)可自由使用和自由發(fā)布的Windows特定頭文件和使用GNU工具集導(dǎo)入庫的集合,允許你在GNU/Linux和Windows平臺(tái)生成本地的Windows程序而不需要第三方C運(yùn)行時(shí)(C Runtime)庫。 ?可以理解成window的編譯器組件;
4、arm-none-eabi-gcc干嘛用的?https://blog.csdn.net/ybhuangfugui/article/details/109733331 ?可以看到 這個(gè)玩意屬于GNU Arm嵌入式工具鏈?
5、Clion創(chuàng)建嵌入式Project時(shí),會(huì)生成一個(gè).ioc文件,這個(gè)文件跟使用STM32CubeMX直接創(chuàng)建的是一樣的。這個(gè).ioc文件描述了“使用的芯片型號(hào)是啥(STM32F030F4Px)”。
6、在Clion中,配置好后,就可以進(jìn)行編譯,下載,調(diào)試;
7、下載程序時(shí),需要指定使用的下載器,如J-Link、ST-Link、CMSIS-DAP等。Clion燒錄程序之前通用需要進(jìn)行一些設(shè)置。在OpenOCD中,Edit,Configurations,生成自己的config.cfg文件,里邊配置“前兩行設(shè)置了仿真器的類型和接口,下面幾行指定了Flash大小、芯片類型、下載速度等。”
8、CLion中組織編譯規(guī)則都是基于CMakeLists.txt
9、Cmake中,// *.*表示通配符,也就是這個(gè)文件夾里的所有文件都會(huì)被編譯
10、GCC 是 GNU 推出的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器,是 GNU 的代表作品之一。
11、早期的GCC主要針對(duì)于C語言,隨著編程的發(fā)展,現(xiàn)在不僅支持C語言,還支持其他很多語言,包括 C++、Ada、Objective-C、Fortran 和 Java 等。
12、GCC 的意思被重新定義為“GNU Compiler Collection”,也即“GUN 編譯器套件”。
13、GCC受到廣大軟件開發(fā)者的喜歡,有一個(gè)很重要的原因就是免費(fèi)。你會(huì)發(fā)現(xiàn)一個(gè)問題,很多開源的IDE,基本上集成的編譯器都是GCC,比如STM32CubeIDE、RT-Thread Studio等。
14、“GNU Arm嵌入式工具鏈”,是ARM 官方推薦的一套工具,主要是針對(duì)32位Arm Cortex-M、 Cortex-R和Cortex-A系列處理器的一套工具鏈。
15、“GNU Arm”包括GNU編譯器(GCC),可直接從Arm免費(fèi)獲得,用于Windows,Linux和Mac OS X操作系統(tǒng)上的嵌入式軟件開發(fā)。 ? https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

如何理解ARM、STM32、51單片機(jī),Intel之間的關(guān)系?
?

1、STM32是使用了ARM核的MCU;
2、其實(shí)除了STM32,ARM核的使用范圍很廣,TI與Freescale也有使用ARM核的MCU與SOC。我們通常把使用ARM核作為核心運(yùn)算功能的片上系統(tǒng)叫做ARM芯片,于是對(duì)ARM芯片的開發(fā),就是題主所說的ARM編程。
4、由于ARM芯片在使用上其實(shí)大同小異,同時(shí)STM32芯片推薦使用的KEIL開發(fā)套件使用起來很好上手,所以題主通過使用STM32來入門ARM編程也是很好的。
5、常用的集成開發(fā)環(huán)境有IAR和Keil,官方教程多用IAR,國(guó)內(nèi)多用Keil。
6、開發(fā)驅(qū)動(dòng)。STM32官網(wǎng)能夠下載官方驅(qū)動(dòng)Demo,
7、開發(fā)應(yīng)用。這里已經(jīng)和MCU或者ARM沒有太多關(guān)系,隨便怎么寫軟件都沒問題。但是開發(fā)時(shí)還是要注意,與windows上的軟件開發(fā)有很大區(qū)別,MCU的資源極其有限,運(yùn)算速度也相對(duì)慢很多,要時(shí)刻注意內(nèi)存溢出、延時(shí)、公共資源被占用等問題。
8、驅(qū)動(dòng)和應(yīng)用其實(shí)說到底是人為的劃分,為了方便項(xiàng)目分工合作以及平臺(tái)間移植,人為將和MCU相關(guān)的代碼定義為“驅(qū)動(dòng)”,而將與MCU關(guān)系不大并且主要是用來實(shí)現(xiàn)功能和特性的代碼定義為“應(yīng)用”。“驅(qū)動(dòng)”和“應(yīng)用”在不同的.c和.h文件中編寫,驅(qū)動(dòng)用來控制MCU中的硬件模塊工作,應(yīng)用通過調(diào)用驅(qū)動(dòng)的接口來實(shí)現(xiàn)對(duì)MCU的控制。
9、"ARM編程",利用ARM MCU,用匯編、C、python等編程。
10、STM32系列MCU(微控制器)只是ST公司設(shè)計(jì)的MCU,是眾多采用ARM架構(gòu)的MCU的其中一種,其它公司也有很多采用ARM架構(gòu)的MCU。

11、Intel和AMD 與 x86,ARM,MIPS有什么區(qū)別?
12、amd和Intel這倆公司的淵源很深,早期時(shí)Intel先是自己搞了個(gè)x86架構(gòu),然后amd拿到了x86的授權(quán)也可以自己做x86了。接著intel向64位過渡的時(shí)候自己搞了個(gè)ia64(x64架構(gòu))但是因?yàn)楹蛒86架構(gòu)不兼容市場(chǎng)反應(yīng)極差,amd率先搞了x86的64位兼容(32和64的混合架構(gòu))也就是后來的x86-64,后來Intel也拿到了生產(chǎn)這貨的授權(quán)(i和a兩家專利交叉的很嚴(yán)重),也搞了x86-64,因?yàn)閍md先搞出來的所以x86-64也叫amd64;
13、目前amd和Intel是世界上最大的兩家x86和x86-64的cpu廠家(intel比較給力,四分天下有其三)。

14再說x86,arm和mips
15、早期的cpu有兩個(gè)設(shè)計(jì)思路,1是把cpu內(nèi)的邏輯電路做的非常復(fù)雜,這樣可以直接用cpu硬件實(shí)現(xiàn)復(fù)雜指令,這個(gè)叫復(fù)雜指令集cisc;另一個(gè)思路是盡可能把cpu做的簡(jiǎn)單,依靠簡(jiǎn)單指令的組合迭代完成復(fù)雜指令,這個(gè)叫精簡(jiǎn)指令集risc。
16、x86目前泛指x86和x86-64架構(gòu),這是因?yàn)閤86-64完全兼容x86。早期的x86是cisc的代表,后來的發(fā)展中逐步引入了risc的部分理念,將內(nèi)部指令的實(shí)現(xiàn)大量模塊化,準(zhǔn)確來說是一個(gè)cisc外加risc部分技術(shù)的架構(gòu)。
17、目前x86的主要產(chǎn)品有Intel的至強(qiáng),酷睿,奔騰,賽揚(yáng)和凌動(dòng);amd的銳龍,apu等。上文提到的x64架構(gòu)目前只有intel 安騰而且已經(jīng)放棄了產(chǎn)品線。
18、到目前為止intel和amd的x86架構(gòu)cpu雖然指令集上有很大差別了但是還是相互兼容的,所以軟件可以直接用。
19、再說arm。arm是risc的典型代表,不過在arm的發(fā)展過程中引入了部分復(fù)雜指令(完全沒有復(fù)雜指令的話操作系統(tǒng)跑起來異常艱難),所以是一個(gè)risc基礎(chǔ)外加cisc技術(shù)的cpu。


除了上述幾家,還有power cpu(risc的,老蘋果用的就是這貨);alpha架構(gòu)的cpu(側(cè)重超算,目前貌似最活躍是中國(guó)申威,神威太湖之光的cpu就是這貨)。

我梳理的框架:
?

============

?

?

總結(jié)

以上是生活随笔為你收集整理的什么是编译、什么是连接。C++代码如何变成机器码,如何跨平台和嵌入式?嵌入式开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。