vc的編譯過程

2021-08-30 08:38:52 字數 2600 閱讀 4639

對vc++工程編譯過程的梳理

vc++的專案和解決方案檔案解讀,無非就是利用這些資訊進行乙個軟體的編譯,這些檔案裡面是存放的專案的配置和工程的組織,類似於makefile檔案. 但是只有vc++6.0的時候可以匯出makefile檔案,vc6的project>export makefile,往後的版本都取消了。 所以只能從各個檔案中去獲取相關資訊,最後才編譯。

編譯器msbuild (vcbuild) 呼叫配置檔案:

文章參閱msdn上的msbuild (visual c++)

.vcxproj:工程配置檔案

.props:使用專案屬性表可以為生成工具(如編譯器或鏈結器)指定開關並建立使用者定義的巨集。

.vcxproj.user:使用者檔案,儲存特定於使用者的屬性,例如除錯和部署設定。vcxproj.user 檔案應用於特定使用者的所有專案。

.vcxproj.filters:當使用解決方案資源管理器向專案中新增檔案時,篩選器檔案 (.vcxproj.filters) 會基於該檔案的副檔名定義在解決方案資源管理器樹檢視的哪個位置新增該檔案。

獲取配置

當編譯程式時,會把上面幾個檔案中所有資訊輸入到編譯器中,結合目前編譯器的全域性引數include files lib files source files等等,從配置檔案中確定標準庫和標頭檔案的位置,使所有參與編譯的依賴關係都找清楚。

編譯預處理階段

讀取源程式,對其中的偽指令(以#開頭的指令)和特殊符號進行處理;

將所有的「#define」指令刪除,並且將巨集定義展開;

處理所有的條件編譯指令;

處理#include預編譯指令,將被包含的標頭檔案插入到預編譯指令的位置。這可能是乙個遞迴操作,如果被包含的標頭檔案中又包含其他標頭檔案;

刪除所有的注釋;

新增行號和檔案標識;

保留所有的#program編譯器指令,後續的編譯步驟中要用到該指令。

經過預編譯的處理以後,標頭檔案被合併到原始檔中,並且所有的巨集定義都被展開。

編譯階段

依賴於編譯器,英文是compile,編譯階段將源程式(*.c 或者*.cpp)轉換成為目標***.obj;

以預編譯的輸出為輸入,將c++源**翻譯成計算機系統應將能夠識別的二進位制機器指令,並將編譯的輸出結果儲存在coff格式的目標檔案中。在編譯的中間過程中,還可以通過cl命令選擇性地輸出組合語言格式的中間檔案。

在執行編譯的時候,編譯器以「.cpp」檔案為單位,對於每乙個「.cpp」檔案,編譯器都會輸出乙個目標檔案。

鏈結階段

連線階段是把源程式轉換成的目標**(obj檔案)與你程式裡面呼叫的庫函式對應的**連線起來形成對應的可執行檔案(exe檔案)就可以了;

2、生成:指的是鏈結的過程,英文是build.依賴於鏈結器. vc中在這一階段將所有的目標檔案和所有需要用到的元件組合成乙個整體,例如需要生成的是windows系統下的pe可執行檔案,鏈結器會依照特定格式將目標檔案組合,最後生成pe格式的.exe或.dll檔案。

總結:見簡簡單單的回顧了編譯的過程,重點想說的是在前面的獲取配置階段,使用者自定義的路徑,引數等都會讀入編譯器,解析出來.

3、除錯:是所有或部分**編寫完成後,讓程式在偵錯程式中執行,用這種手段對程式進行分析,找出並修正潛在問題。

4、執行:就是讓程式在系統中執行。

應用:myserialporttools.vcxproj.user 中定義了qtdir

<?xml version="1.0" encoding="utf-8"?>

d:\qt\qt5.7.0\5.7\msvc2015_64

path=$(qtdir)\bin%3b$(path)

d:\qt\qt5.7.0\5.7\msvc2015_64

path=$(qtdir)\bin%3b$(path)12

3456

78910

1112

myserialporttools.vcxproj檔案中會直接用這個引數qtdir

.;$(qtdir)\include;$(qtdir)\include\qtgui;$(qtdir)\include\qtangle;$(qtdir)\include\qtcore;temp\moc;$(qtdir)\mkspecs\win32-msvc2015;.\generatedfiles;$(qtdir)\include\qtwidgets;%(additionalincludedirectories)

-zc:strictstrings -zc:throwingnew %(additionaloptions)

temp\obj\

false

none

sync

$(intdir)

maxspeed

_windows;unicode;win32;win64;qt_no_debug;ndebug;qt_widgets_lib;%(preprocessordefinitions)

false

$(intdir)vc$(platformtoolsetversion).pdb

multithreadeddll

true

true

true

turnoffallwarnings

VC編譯選項

vc編譯選項 od 禁用優化 預設值 disable optimizations default ox 最大化選項。ogityb2 gs maximum opts.ogityb1 gs og 啟用全域性優化 enable global optimization oy 啟用框架指標省略 enable ...

VC 編譯設定

使用dll,採用顯式宣告時,可以用如下三種方式新增lib a.可以到 project 選單下選擇 add to project files 然後把lib檔案加進來。b.也可以設定工程選項 到 project 選單下選擇 settings 然後選擇 link 選項卡,在其中的object librar...

VC編譯選項

今天練習vc編譯選項設定。現在有三個工程a b和c a和b是鏈結庫,c是exe的demo程式。b呼叫a,c呼叫b。1.最初的編譯是 a b編為動態庫,並生成lib,c包含這個lib,生成exe。這樣是簡單的,c的專案設定link屬性頁 category為input的選項中,填入a與b的lib就可以了...