VS新增lib以及對編譯過程的總結

2021-07-16 12:27:39 字數 2349 閱讀 6833

本來是想在vs2013新增乙個lib的。由此認識到對編譯的原理認識不清楚,所以記錄一下

先說在vs中新增lib庫的方法:

通過設定工程來新增lib庫:

1.新增乙個專案,右鍵屬性,改變 配置屬性----常規 中的配置型別為靜態庫或者動態庫,然後可以改變輸出目錄(指定一下庫目錄),此步驟就設定成了乙個lib庫

2.在專案中使用,也需要設定屬性,因為要保證找到標頭檔案和庫檔案,所以在 配置屬性-----vc++ 下,加上包含目錄(頭檔案目錄路徑)和庫目錄(生成的庫目錄路徑),然後在 鏈結器-----輸入 中新增 附加依賴項(庫名)

以上步驟可以建立乙個公用庫,以方便不同專案呼叫

接下來是對編譯原理的一些總結:

編譯原理:

c標頭檔案與庫檔案的區別:

標頭檔案中只能有宣告,不能放定義:

編譯的四個過程:

1.預處理

預處理是

c語言程式從源**變成可執行程式的第一步,主要是

c語言編譯器對各種預處理命令進行處理,包括標頭檔案的包含、巨集定義的擴充套件、條件編譯的選擇等。

2.編譯

編譯之前,c

語言編譯器會進行詞法分析、語法分析

(-fsyntax-only)

,接著會把源**翻譯成中間語言,即組合語言

。如果想看到這個中間結果,可以用

-s選項。

3.彙編

把作為中間結果的彙編**翻譯成了機器**,即目標**,不過它還不可以執行。如果要產生這一中間結果,可用gcc的-c

選項,當然,也可通過

as命令_彙編

_組合語言原始檔來產生。

4.鏈結

鏈結是處理可重定位檔案,把它們的各種符號引用和符號定義轉換為可執行檔案中的合適資訊(

一般是虛擬記憶體位址

)的過程。鏈結又分為靜態鏈結和動態鏈結,前者是程式開發階段程式設計師用

ld(gcc

實際上在後台呼叫了

ld)靜態鏈結器手動鏈結的過程,而動態鏈結則是程式執行期間系統呼叫動態鏈結器

(ld-linux.so)

自動鏈結的過程。

由此我又想到標頭檔案和庫檔案有什麼區別,為什麼標頭檔案只能有宣告,不能有定義,#ifndef不就是來防止標頭檔案重複載入的嗎?

標頭檔案用於存放對型別定義、函式宣告、全域性變數宣告等實體的宣告,作為對外介面;而源程式檔案存放型別的實現、函式體、全域性變數定義。

標頭檔案中為什麼不能有定義:

首先必須了解編譯的過程,編譯的第一步是把所有的cpp檔案編譯成為點o檔案,而且每乙個點cpp檔案都是單獨編譯的,該點cpp檔案中用到的型別必須在它所include 的標頭檔案當中找到,相當於把它所有include的檔案中的**都加到該cpp檔案的前面,但是宣告的部分將不會出現在編譯後的點o檔案,相當於每個cpp檔案都是單獨編譯,因此它的ifndef在乙個檔案裡是沒有用的,兩個cpp檔案裡如果包含同乙個有ifndef的標頭檔案,效果是兩個cpp檔案都把該標頭檔案加到它的前面,但不會把宣告的部分放到點o檔案中,而會把頭檔案中定義的部分都輸出到編譯後的點o檔案當中

因此如果在標頭檔案當中有乙個定義,那麼如果有兩個cpp檔案當中include了它,那麼將會出現重定義錯誤,multiple definition of。

那麼#ifndef做什麼呢?

我覺得#ifndef只能防止兩個包含了乙個基 標頭檔案,但在乙個檔案中卻同時包含了這兩個標頭檔案,這個時候是可以防止重複載入的,相當於c++的多重整合,虛繼承就是保證只繼承到乙個基類。

來做個總結:

我們在程式中要保證的是能找到標頭檔案和庫檔案

那麼預處理階段就是找到標頭檔案並將其原封不動的載入到當前檔案中:

#include載入標頭檔案

< >引用的是編譯器的類庫路徑裡面的標頭檔案

" "引用的是你程式目錄的相對路徑中的標頭檔案

當然在linux中也可以用-i選項指定標頭檔案路徑

有了標頭檔案中的宣告,就可以進行詞法分析、語法分析了

而庫檔案是鏈結的時候所需要的,所以我們可以放到標準路徑或者用-l指定路徑,當然也可以修改環境變數,鏈結將多個目標檔案整合成乙個可執行檔案。

當然,動態庫是在執行時載入的,所以執行時仍需要知道庫路徑,此時可以修改環境變數,或者放到標準庫目錄中

關於原始檔中應不應該include此原始檔對應的標頭檔案,如果需要有宣告的地方那麼是需要加標頭檔案,比如.h中有兩個函式的宣告,.cpp中其中乙個函式呼叫了另外乙個,此時就需要宣告,所以需要加標頭檔案,

不然也不用加,因為只是簡單的替換

比如:.h檔案中宣告乙個函式,.cpp中實現這個函式,那便不用加

因為在鏈結之前都是單獨編譯的,在鏈結時整合**,如果乙個專案中有多個同名函式且引數也相同時(c++支援過載),那麼就需要命名空間了,來具體指出是哪個庫檔案。

寫的比較亂,請諒解,有機會再改

陣列以及對其常用的操作

陣列 本身就是乙個容器,用來儲存資料。特點 是固定長度的。好處 給元素進行編號,從零開始。同時也可以通過length屬性獲取陣列長度。什麼時候使用陣列呢?當資料較多時,通常為了方便操作這些資料都需要進行臨時儲存。習慣 通常運算元組都需要進行遍歷。獲取陣列中的元素需要乙個指標。通過對指標的值的改變就可...

CSS的 important屬性 以及對它的誤解

css中的 important是乙個非常重要的屬性,這個屬性是css規範中的,但ie6不支援,也正是因為它不支援,才讓人找到了解決ie6和別的瀏覽器不相容問題的辦法。一般來說,在css中,如果在同乙個css塊中寫兩個相同的屬性,那麼是按照後出現的來執行的,比如 body margin left 20...

vs專案中新增lib庫的方法總結

lib是windows的庫檔案,分動態庫和靜態庫。靜態lib把匯出的宣告和實現都放在lib中,編譯後所有 都嵌入宿主程式。動態lib則相當於乙個.h檔案,把匯出的宣告放在lib裡,編譯後只有宣告嵌入了宿主程式,要配合.dll檔案使用 把lib檔案匯入vs的工程裡有兩種方法 首先保證你的lib檔案在編...