當前位置:首頁 » 編程軟體 » hpp編譯

hpp編譯

發布時間: 2022-11-16 13:24:52

編譯器在編譯階段,究竟做哪些事情

1. 預處理首先源代碼文件(.c/.cpp)和相關頭文件(.h/.hpp)被預處理器cpp預編譯成.i文件(C++為.ii)。預處理命令為:gcc –E hello.c –o hello.i預編譯過程主要處理那些源代碼中以#開始的預編譯指令,主要處理規則如下:u 將所有的#define刪除,並且展開所有的宏定義;u 處理所有條件編譯指令,如#if,#ifdef等;u 處理#include預編譯指令,將被包含的文件插入到該預編譯指令的位置。該過程遞歸進行,及被包含的文件可能還包含其他文件。u 刪除所有的注釋//和 /**/;u 添加行號和文件標識,如#2 「hello.c」 2,以便於編譯時編譯器產生調試用的行號信息及用於編譯時產生編譯錯誤或警告時能夠顯示行號信息;u 保留所有的#pragma編譯器指令,因為編譯器須要使用它們。2. 編譯編譯過程就是把預處理完的文件進行一系列詞法分析,語法分析,語義分析及優化後生成相應的匯編代碼文件(.s)。編譯的命令為:gcc –S hello.i –o hello.s或者從源文件直接輸出匯編代碼文件:gcc –S hello.c –o hello.s現在版本的GCC把預編譯和編譯兩個步驟合並成一個步驟,由程序cc1來完成(C++為cc1plus)。3. 匯編匯編就是將匯編代碼轉變成機器可以執行的命令,生成目標文件(.o),匯編器as根據匯編指令和機器指令的對照表一一翻譯即可完成。匯編的命令為:gcc –c hello.s –o hello.o或者從源文件直接輸出目標文件:gcc –c hello.c –o hello.o4. 鏈接鏈接就是鏈接器ld將各個目標文件組裝在一起,解決符號依賴,庫依賴關系,並生成可執行文件。鏈接的命令為:ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o一般我們使用一條命令就可以完成上述4個步驟:gcc hello.c實際上gcc只是一些其它程序的包裝,它會根據不同參數去調用預編譯編譯程序cc1、匯編器as、鏈接器ld。

⑵ 為什麼C++類的頭文件中包含hpp文件時會報錯呢

雖然你是一句話。但是憑我的經驗來說。我已經明白了你的問題。
你的意思是 你的類 聲明在 .h文件中。定義在.cpp文件中。這個.cpp文件肯定包含了前面的.h文件。
然後這個.h中 包含了 某個 .hpp文件。於是編譯的時候 相當於 .h包含了一次 .hpp。.cpp也包含了一次.hpp。如果.hpp文件中 你定義了全局變數或者全局函數。則會編譯報錯——重定義!!。
這也是我 超級不喜歡用.hpp的原因。建議 吧.hpp文件 拆分成.h和.cpp。或者不要在.hpp裡面定義全局的變數和函數

⑶ 如何編譯Delphi組件讓其在C++ Builder中可用

1、首先,我們要使用Rad Studio,而不是Delphi或C++Builder來操作,所以注意第一點,否則可會失敗喲。如果你只裝了CB或只裝了Delphi,你就重裝吧。
2、打開相應版本的Delphi版目錄,發現有兩個VirtualTreesD和VirtualTreesR兩個Delphi安裝包,Delphi用戶那裡,我們可以竊聽到一個重要的信息:以R結尾的一般是運行時包,以D結尾的一般是設計期包。所以我們要先打開運行期包VirtualTreesR.dpk:
3、打開項目選項(Project->Options),然後找到關鍵的地方:Delphi Compiler->Output-C/C++,在最右側的C/C++ Output file generation里,選中Generate all C++ Builder files(Including package libs)選項,然後選OK關閉窗口。
4、Ctrl+F9編譯項目,完成運行時包的編譯。
5、重復上面的步驟打開VirtualTreesD.dpk,然後修改完選項後,選擇Install來安裝包,然後你會幸運的得到提示,提示你組件已經安裝成功了。
6、現在新建一個項目,到組件面板上找TVirtualStringTree吧。
同樣的經驗適用於其它絕大多數Delphi控制項,比如Graphics32,但注意你可能需要對最終生成的HPP文件做一些改動,以避免與C++里自帶的內容沖突,這個遇到一處改掉一處,就不再綴述了。

⑷ opencv怎麼一編譯全是cxcore.hpp的錯誤啊,求高手救命..

上述提示說的意思是:沒找到DLL的符號信息。
說明你的程序運行需要(或間接需要)這些DLL。
應該是配置問題,下面這個網址有詳細說明OpenCV的配置

另外,檢查一下你是bug版,還是release版。OpenCV bug版應配置文件名帶d的DLL,比如cxcore100d.dll,release版是cxcore100.dll

⑸ 為什麼需要編譯OpenCV源代碼

..\OpenCV2.3\opencv\moles 這個目錄有一些常用的庫,一般演算法的實現是看不到的,通常在靜態庫里,你可以連接他們,生成執行文件。
hpp,其實質就是將.cpp的實現代碼混入.h頭文件當中,定義與實現都包含在同一文件,則該類的調用者只需要include該hpp文件即可,無需再 將cpp加入到project中進行編譯。而實現代碼將直接編譯到調用者的obj文件中,不再生成單獨的虎矗港匪蕃睹歌色攻姬obj,採用hpp將大幅度減少調用 project中的cpp文件數與編譯次數,也不用再發布煩人的lib與dll,因此非常適合用來編寫公用的開源庫。

⑹ C++builder編譯時提示TeCanvas.hpp庫函數有錯

這種情況一般是,在安裝三方控制項的電腦中建立的工程,在工程中沒有用到它,但在工程文件中包含它,這時,換一台電腦後,沒有安裝這個三方控制項,就提示出錯。
解決方法:在你的電腦中,用無格式的文本編輯軟體打開這個工程文件,找到它,刪除,就可以解決問題。

⑺ .hpp是什麼文件

hpp是C++程序頭文件 。

HPP,計算機術語,用C/C++語言編寫的頭文件,通常用來定義數據類型,聲明變數、函數、結構和類。
hpp,其實質就是將.cpp的實現代碼混入.h頭文件當中,定義與實現都包含在同一文件,則該類的調用者只需要include該hpp文件即可,無需再 將cpp加入到project中進行編譯。而實現代碼將直接編譯到調用者的obj文件中,不再生成單獨的obj,採用hpp將大幅度減少調用 project中的cpp文件數與編譯次數,也不用再發布煩人的lib與dll,因此非常適合用來編寫公用的開源庫。

⑻ VS2008下編譯BasicExcel.hpp和cpp不通過,請問具體原因,急!!!!

看看BasicExcel.h裡面是不是還引用了其他文件,也得加進去

⑼ HPP的注意問題

*.hpp要注意的問題有:
a)不可包含全局對象和全局函數
由於hpp本質上是作為.h被調用者include,所以當hpp文件中存在全局對象或者全局函數,而該hpp被多個
調用者include時,將在鏈接時導致符號重定義錯誤。要避免這種情況,需要去除全局對象,將全局函數封
裝為類的靜態方法。
b)類之間不可循環調用
在.h和.cpp的場景中,當兩個類或者多個類之間有循環調用關系時,只要預先在頭文件做被調用類的聲明
即可,如下:
class B;
class A{
public:
void someMethod(B b);
};
class B{
public:
void someMethod(A a);
};
在hpp場景中,由於定義與實現都已經存在於一個文件,調用者必需明確知道被調用者的所有定義,而不能等到cpp
中去編譯。因此hpp中必須整理類之間調用關系,不可產生循環調用。同理,對於當兩個類A和B分別定義在各自的
hpp文件中,形如以下的循環調用也將導致編譯錯誤:
//a.hpp
#include b.hpp
class A{
public:
void someMethod(B b);
};
//b.hpp
#include a.hpp
class B{
public:
void someMethod(A a);
}
c)不可使用靜態成員
靜態成員的使用限制在於如果類含有靜態成員,則在hpp中必需加入靜態成員初始化代碼,當該hpp被多個文檔include時,將產生符號重定義錯誤。唯 一的例外是const static整型成員,因為在vs2003中,該類型允許在定義時初始化,如:
class A{
public:
const static int intValue = 123;
};
由於靜態成員的使用是很常見的場景,無法強制清除,因此可以考慮以下幾種方式(以下示例均為同一類中方法)
一、類中僅有一個靜態成員時,且僅有一個調用者時,可以通過局域靜態變數模擬
//方法模擬獲取靜態成員
someType getMember()
{
static someType value(xxx);//作用域內靜態變數
return value;
}
二、.類中有多個方法需要調用靜態成員,而且可能存在多個靜態成員時,可以將每個靜態成員封裝一個模擬方法,供其他方法調用。
someType getMemberA()
{
static someType value(xxx);//作用域內靜態變數
return value;
}
someType getMemberB()
{
static someType value(xxx);//作用域內靜態變數
return value;
}
void accessMemberA()
{
someType member = getMemberA();//獲取靜態成員
};
//獲取兩個靜態成員
void accessStaticMember()
{
someType a = getMemberA();//獲取靜態成員
someType b = getMemberB();
};
三、第二種方法對於大部分情況是通用的,但是當所需的靜態成員過多時,編寫封裝方法的工作量將非常
巨大,在此種情況下,建議使用Singleton模式,將被調用類定義成普通類,然後使用Singleton將其變為
全局唯一的對象進行調用。
如原h+cpp下的定義如下:
class A{
public:
type getMember(){
return member;
}
static type member;//靜態成員
}
採用singleton方式,實現代碼可能如下(singleton實現請自行查閱相關文檔)
//實際實現類
class Aprovider{
public:
type getMember(){
return member;
}
type member;//變為普通成員
}
//提供給調用者的介面類
class A{
public:
type getMember(){
return Singleton<AProvider>::getInstance()->getMember();
}
}

⑽ c++.hpp什麼時候用

1、是Header Plus Plus 的簡寫。
2、與*.h類似,hpp是C++程序頭文件 。
3、是VCL 專用的頭文件,已預編譯。
4、是一般模板類的頭文件。
5、一般來說,*.h裡面只有聲明,沒有實現,而*.hpp里聲明實現都有,後者可以減 少.cpp的數量。
hpp要注意的問題 http://ke..com/view/3779455.htm

熱點內容
吃雞最佳配置怎麼看 發布:2025-05-14 00:25:32 瀏覽:225
oraclesql效率 發布:2025-05-14 00:17:40 瀏覽:601
cifjava代碼 發布:2025-05-14 00:10:34 瀏覽:212
泰國電視劇密碼在哪裡看 發布:2025-05-13 23:54:22 瀏覽:481
安卓用郵件下完保存在哪裡 發布:2025-05-13 23:52:31 瀏覽:479
解壓美食蛋糕 發布:2025-05-13 23:36:25 瀏覽:354
php含有字元 發布:2025-05-13 23:32:08 瀏覽:184
如何找出蘋果手機已連接wifi密碼 發布:2025-05-13 23:22:52 瀏覽:264
ie10緩存 發布:2025-05-13 23:10:09 瀏覽:459
安卓手機圖標怎麼設置提示 發布:2025-05-13 23:07:56 瀏覽:810