1. 程式人生 > >程式從編譯到執行

程式從編譯到執行

源程式會經過預處理,編譯,彙編,連結多個步驟才能在機器上生成可執行程式。


1.預處理


前處理器在程式編譯之前,會先進行預處理工作,在C程式中,#開頭的程式碼都屬於預處理範圍。

1)#include : 將標頭檔案包含到當前原始檔中
2)#define : 將巨集定義展開 
3)#ifdef : 按照條件處理編譯內容
4)#other : 處理其他巨集指令
          預處理除了處理#開頭的程式碼,還處理


         1)處理預定義的巨集:如_FILE_

         2)  用一個空格代替連續的註釋

         3)處理三元符: 例如將??= 替換成 #, ??/ 替換成 \


2.編譯


 編譯器會對預處理的程式碼進行詞法分析,語法分析,語義分析,將符合規定的程式碼轉換成等價的彙編程式碼。


3.彙編


 彙編器將編譯器生成的彙編程式碼生成計算機可以直接識別的機器指令,並生成目標檔案。


4.連結


 連結會將所有用到的目標程式連結程式連結起來,無論是動態連結還是靜態連結,最終都會生成一個可以在計算機上直接執行的可執行程式。






例子:



1.#include<> 和 #include ""的區別:#include<>直接從編譯器指定的庫檔案中去查詢,而#include "" 會先中原始檔所在目錄中查詢(或者當“”中指定的路徑),如果找不到,則會再次從編譯器指定的路徑中去查詢。

2.#define 巨集定義的過程當中如 :

  #define HEIHEI(x,y,z) (x##y#z) 

  ## 會將其前後的引數轉換成字串,#會將其後的引數字串化,因此HEIHEI(H,1,2) 後連線的結果是"H12"

3. assert 巨集: 包含有assert.h 中,

A. assert 最好檢測一個條件,以便準確定位錯誤資訊內容
B. assert 中不要修改變數的值,因為如果assert 在正式RELEASE 之後被遮蔽了,那麼裡面的變數也會將被遮蔽,此時如果在內部對變數有操作,那可能會影響程式正常執行。

相關推薦

程式編譯執行

源程式會經過預處理,編譯,彙編,連結多個步驟才能在機器上生成可執行程式。1.預處理 前處理器在程式編譯之前,會先進行預處理工作,在C程式中,#開頭的程式碼都屬於預處理範圍。 1)#include : 將標頭檔案包含到當前原始檔中 2)#define : 將巨集定義展

C/C++程式編譯到最終生成可執行檔案的過程分析

     *******************************************************篇一*******************************************************************************************

Linux系統程式編譯到二進位制安裝

很長一段時間以來,安裝 LAMP 時都是編譯安裝其資料庫(MySQL,MariaDB,Percona Server)的。這是一個非常耗時的過程,而且編譯安裝的版本,很多外掛預設是不會被編譯安裝的。 偶然間在 MariaDB 的下載列表裡,看到有適用於 Linux 下的二進位制安裝

學習應用程式編譯 執行 修改許可權

1 新建資料夾 以及 sex.c 檔案 、 2  通過cd 回到根目錄  vim .bashrc 蔣編譯器修改為 和編譯核心一樣的編譯器(通過shift + g 可以移到最後一行) 3 進入sex.c檔案所在路徑,arm-none-linux-gnueabi

基於Android arm64 可執行程式編譯執行

Android預設編譯的應用程式動態連結的一般都是PIE,前文“基於Android arm64 Linux got 除錯”,每次除錯都要檢視載入地址,於是就想能否編譯生成非PIE的應用程式。 /opt/android-6.0.1_r9/external/hel

解決linux/Ubuntu下Qt creater 介面程式編譯執行後無法顯示中文或中文亂碼問題(轉)

本文解決的主要是介面程式編譯執行後無法顯示中文的問題,如果在creater 中無法輸入中文,下載個IBus或者搜狗之類的中文輸入法即可解決! 首先說亂碼問題,這個很好解決: 如果是在Linux下開啟Windows下的專案出現亂碼,選擇編碼為“GB2312”即可! 現在主要

使用命令列對java程式編譯執行和打包

0x00 背景 我們平時使用了在有IDE的環境下編寫程式碼,編譯的工作會由IDE自動完成,這樣方便了我們工作,但是卻使我們忽略了程式碼是如何執行的本質,或者當電腦上只有jre環境,沒有開發環境,就需要在cmd環境下進行java程式的編譯和執行,本文詳細介紹瞭

C++程式如何編譯執行

下面是C++入門的hello world程式原始碼 #include <iostream> using namesp

QT編寫的程式Windows作業系統中移植到樹莓派中編譯執行

     開發環境    Win10 + QT5.6  和 樹莓派 1.在Win10中用QT新建一個 Qt  Widgets Application 專案    2 .找到工程目錄 3 .將整個

Java程式為何“編譯一次,到處執行

與其他語言相比,Java程式能夠做到“編譯一次,到處執行”,可見它的跨平臺性非常強。但是java的這種跨平臺到底是怎麼一回事啊,在這之前我們先了解一下不能跨平臺是怎麼一回事。         C或者C++等高階語言

Linux環境下c程式編譯執行

1 單個檔案的編譯和執行建立main.c檔案,內容如下: #include <stdio.h> #include <stdlib.h> int main(void){ printf("Hello world!\n"); return 0; };   編譯:

Ubuntu下編輯並編譯執行c++程式

一、使用vim編輯c++程式碼: vim hello.cpp 輸入如下程式碼: #include <iostream> using namespace std; int main() { cout<<"Hello world!"<<endl;

使用Notepad++編譯執行C/C++/Python程式

對我來說,比較常用的是C/C++/Python。 使用Notepad++編譯執行單個原始檔的C/C++/Python,比使用複雜的IDE更加快捷。 想要讓Notepad++能夠做到編譯執行C/C++/Python程式,你需要: 0. 準備好編譯器 C/C++編譯器,這裡推薦MinGW:https://

如何編譯執行譚浩強所著C++程式設計這本書中程式

如何編譯執行譚浩強所著C++程式設計這本書中程式 工具:Microsoft Visual Studio 2013 操作:檔案-新建-專案-Win32-Win32控制檯應用程式(確定名稱-空專案-完 成) 所謂空專案,是指當學習簡單的C++語言示例,不需要預設的預編譯標頭檔案選項,

【C++筆記】Windows通過命令列編譯執行c程式 (轉載)

1.準備 一臺具備c開發環境的Windows。 驗證方式,命令列輸入gcc -v,檢視是否輸出版本資訊。 gcc -v 1 2.寫程式 在E盤建一個資料夾C,在裡面建立一個Hello.c檔案,副檔名是c,內容如下: #include <stdio.h>

Sublime Text 3 編譯/執行Java程式(轉)

0 如果你還沒有安裝JAVA 按預設配置安裝(一直點下一步) 配置環境變數 • 按下Win鍵,開啟開始選單,在搜尋框輸入“環境變數” • 開啟 編輯系統環境變數 • 在彈出的系統屬性視窗找到右下方 環境變數 • (新建) JAVAHOME • C:\Pro

在linux環境下編譯執行OpenCV程式的兩種方法

  原來以為在Ubuntu下安裝好了OpenCV之後,自己寫個簡單的程式應該很容易吧,但是呢,就是為了編譯一個簡單的顯示圖片的程式我都快被弄崩潰了。   在谷歌和上StackOverFlow檢視相關問題解答之後,我下面就介紹Command Line和CMake兩種方式。

在CentOS6.4下使用Eclipse編譯執行MapReduce程式Hadoop2.6.5

本文是本人按照廈門大學林子雨老師的教程然後自己在使用Eclipse編譯執行MapReduce程式的時候所做的一個部落格教程,意在幫助更多的人。廈門大學林子雨老師的教程地址:http://dblab.xmu.edu.cn/blog/hadoop-build-project-using-ecli

編譯到可執行檔案

我們的平時寫的程式碼是經過怎樣的過成變成讓計算機可執行的檔案。下面我給出了一個大致的流程: 原始碼經過預編譯,編譯,彙編,連結過程到可執行的exe檔案。 其實我們的程式碼就產生了兩種東西,一種是資料一種是指令。 資料和指令可定不能雜亂的放在一起,系統會將我們的資料和

針對QT——“在程式檔案中(*ui,*cpp,*h)更改之後編譯執行程式結果無法更新”——解決方案

本篇文章主要介紹在QT中,對程式檔案(*ui,*cpp,*h)更改之後編譯執行的程式結果卻無法更新的解決方案。 問題描述 在設計QT的GUI使用者介面時,我們需要不斷對程式檔案進行修改以優化使用者體驗,因此需要更新程式的生成檔案。 實際經歷:筆者最近在一個專案中需要將QT的GUI程式