網(wǎng)站首頁 編程語言 正文
?前言:
C++有個最大的特點,那便是編譯型語言,相比于Python
這種解釋型語言,C++在編譯階段就進行了許多處理,在執(zhí)行階段便具有高效性,本篇主要講解C++中的編譯與鏈接;
一、編譯與鏈接模型
1、一開始的C++是一個簡單的加工模型,如下圖所示:
這樣會存在一些問題:
- 無法處理大型程序
- 加工耗時較長
- 即使少量修改,也需要全部重新加工
2、為了解決以上問題,引入了分塊處理的方式:
編譯鏈接模型的好處:
- 編譯耗資源但一次處理輸入較少
- 鏈接輸入較多但處理速度快
- 便于程序修改(只需修改一部分)
在引入分塊處理后,出現(xiàn)了一些常見概念:
①定義與聲明:一個變量在只需在一個文件中定義,其他文件可通過聲明該變量;
②頭文件與源文件:由于聲明的變量、函數(shù)過多,可將聲明放在頭文件中,在源文件中引用頭文件加載這些聲明;
③翻譯單元:源文件 + 相關頭文件(直接/間接)- 應忽略的預處理語句(宏定義不符合條件的);
二、編譯與鏈接流程
下面通過一個實際例子,講解程序如何從cpp一步步到可執(zhí)行文件的;
下圖為一個整體流程圖:
1、預處理階段:將cpp或c的源程序進行處理(頭文件展開等),轉換成以i結尾的翻譯單元文件
g++ -E ./main.cpp -o ./main.i
2、編譯階段:生成編譯后以s為后綴的匯編代碼文件
g++ main.i -S -o main.s
3、匯編階段:將匯編代碼進行匯編生成以o為后綴目標文件
4、鏈接階段:合并多個目標文件,關聯(lián)聲明與定義,生成可執(zhí)行程序
以上為系統(tǒng)內部具體的實現(xiàn)操作,我們在實際運行中可以通過一行命令實現(xiàn)編譯鏈接:
g++ ./main.cpp -o ./main
注意點:在用IDE編譯程序時,往往會有兩種模式:Debug和Release,Debug在開發(fā)中使用,優(yōu)化較少,Release在最終程序編譯使用,優(yōu)化較多;
三、總結
- C++的編譯與鏈接過程是復雜的,預處理、編譯與鏈接都可能出錯,要細心排除;
- 編譯可能產生警告、錯誤,都要重視;
- 我個人的感受,會遇到一些很奇怪的坑,不管從環(huán)境還是依賴庫,這就需要有耐心不斷嘗試,并且總結經驗;
原文鏈接:https://blog.csdn.net/weixin_40620310/article/details/121196433
相關推薦
- 2022-11-25 詳解Python中的數(shù)據(jù)精度問題_python
- 2022-10-04 R語言將變量分組的3種方法實例(含cut函數(shù)說明)_R語言
- 2022-05-22 Docker容器搭建Kafka集群的詳細過程_docker
- 2024-02-25 maven打包測試jar包沖突
- 2022-08-13 oracle利用sql語句實現(xiàn)分組小計(grouping,group by ,rollup)
- 2023-03-26 使用docker安裝hadoop的實現(xiàn)過程_docker
- 2022-11-21 如何使用正則表達式對輸入數(shù)字進行匹配詳解_正則表達式
- 2022-10-15 Redisson?加鎖解鎖的實現(xiàn)_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支