C 編譯中碰到的問題

2021-06-18 14:50:55 字數 3130 閱讀 3485

vs2010編譯

編譯器可以連線多種庫,如c執行庫,標準c++庫,和舊iostream 庫

c++包含標頭檔案帶 .h,如#include則visual c++在編譯時,自動連線到舊的iostream庫中。

如果不帶.h,並使用了命名空間std, 如#

include

using namespace std;

則編譯時,鏈結到標準c++庫。

執行庫分為靜態鏈結庫,字尾名.lib,編譯時,程式自動和庫檔案連線。

動態鏈結庫,字尾名 .dll,它匯入的庫檔案的拓展名認為.lib,但與靜態鏈結庫lib有很大區別,導入庫檔案用於連線dll庫的關聯檔案,其中沒有定義函式**,只儲存函式的入口位址,進行鏈結時幫助聯結器找到dll庫中對應的函式。

預編譯預編譯標頭檔案

(一般擴充套件名為

.pch),

是把乙個工程中較穩定的**預先編譯好放在乙個檔案

(.pch)裡.

這些預先編譯好的**可以是任何的

c/c++

**--

甚至可以是

inline函式,

只它們在整個工程中是較為穩定的

,即在工程開發過程中不會經常被修改的**

. 為什麼需要預編譯標頭檔案

?一言以蔽之

:提高編譯速度

.一般地

,編譯器以檔案為單位編譯

,如果修改了一工程中的乙個檔案則所有檔案都要重新編譯

,包括標頭檔案裡的所有東西

(eg.macro

巨集,preprocessor

預處理),而vc

程式中,

這些標頭檔案中所包括的東西往往是非常大的

,編譯之將佔很長的時間

.但它們又不常被修改

,是較穩定的

,為單獨的乙個小檔案而重新編譯整個工程的所有檔案導致編譯效率下降

,因此引入了

.pch

檔案.

如何使用預編譯標頭檔案以提高編譯速度

?要使用預編譯標頭檔案

,必須指定乙個標頭檔案

(.h),

它包含我們不會經常修改的**和其他的標頭檔案

,然後用這個標頭檔案

(.h)

來生成乙個預編譯標頭檔案

(.pch)vc

預設的標頭檔案就是

stdafx.h,

因為標頭檔案是不能編譯的

,所以我們還需要乙個

.cpp

檔案來作橋梁

,vc預設的檔案為

stdafx.cpp,

這個檔案裡只有一句**就是:#

include"stdafx.h".

接下來要用它生成

.pch檔案,

涉及到幾個重要的預編譯指令

:/yu,/yc,/yx,/fp.

簡單地說

,/yc

是用來生成

.pch

檔案的編譯開關.在

project->setting->c/c++

的category

裡的precompiled header,

然後在左邊的樹形檢視中選擇用來編譯生成

.pch

檔案的.cpp檔案(

預設即stdafx.cpp)

你就可以看到

/yc這個開關

,它表示這個檔案編譯了以後是否生成

.pch檔案(

可能/yc的c

表示create)./fp

指令指定生成的

.pch

檔案的名字及路徑(可能

/fp的p代表

path)./yu的u

即use使用,

工程中只要包括了

.h檔案的檔案都會有這個

/yu指令

.如果選擇自動

automatic...

的話則原來為

/yc的地方就換成了

/yx指令

.如果選擇自動

,則每次編譯時編譯器會看以前有沒有生成過

.pch檔案,

有則不現生成否則就再次編譯產生

.pch檔案.

編譯錯誤

#include

類的標頭檔案與直接寫

class

加類名有何區別

使用class  類名一般是為了去除編譯依賴,減少編譯消耗的時

#include "xx.h" 在編譯的時候把xx.h檔案直接展開,所以裡面的介面都能用,可以申明物件。但是classxx;這種方式就不會,你只能使用它的指標或者引用,你不能建立申明物件。

1>listeningsocket.obj: error lnk2001: unresolved external symbol "public: virtual structcruntimeclass * __thiscall clisteningsocket::getruntimeclass(void)const "(?getruntimeclass@clisteningsocket@@ubepaucruntimeclass@@xz)

編譯出錯,還有可能與#include .h檔案的順序有關,這個坑爹!!!!

error c2236

error2236, 可能引用標頭檔案的時候,被引用的標頭檔案的最後要有分號!!

如果前面沒東西, 看

上乙個標頭檔案最後面是什麼

.那地方應該少了個分號

error 2146

在乙個類a的宣告檔案(標頭檔案)中包含了另乙個類b的標頭檔案,而b的標頭檔案中含有類a的應用,可能導致在編譯類a的標頭檔案時會用到a的物件等,導致未定義!!!!

在任何cpp檔案的開頭都按這樣的順序include:  

#include  "***doc.h"  

#include  "***view.h"  

#include  "mainfrm.h"  

注意,doc的標頭檔案一定要在最前面。這樣你的cdemoview和cmyview也可以共享乙個cdemodoc。  

一般在cpp中包含檔案是要注意類的包含關係,被包含的類定義應該在前面。如果實在有衝突,可以在乙個類的標頭檔案中加:class   c***doc;之類的空定義。這樣定義過的標頭檔案中可以用c***doc申明指標,但是不能申明實際物件

coreutils 交叉編譯碰到的問題

閱讀 深度探索linux 遇到的問題 編譯coreutils時遇到的兩個問題 交叉編譯需要指定 configure host i686 none linux gnu 參考 make install 碰到錯誤,bin bash src make prime list no such file or d...

VINS Fusion 編譯執行碰到的問題

eigen 3.3.7 cmake dcmake install prefix usr sudo make install ceres 1.14.0 編譯ceres時 could not find a configuration file for package eigen3 that is com...

gcc和g 編譯c或者c 檔案碰到的問題

誤區一 gcc只能編譯c g 只能編譯c 兩者都可以,但是請注意 1.字尾為.c的,gcc把它當作是c程式,而g 當作是c 程式 字尾為.cpp的,兩者都會認為是c 程式,注意,雖然c 是c的超集,但是兩者對語法的要求是有區別的。c 的語法規則更加嚴謹一些。2.編譯階段,g 會呼叫gcc,對於c 兩...