?? openssl編譯.txt
字號:
前幾天,為了給大家提供新版本的openssl,又重新做了一次openssl的編譯工作,并比較了幾種編譯方法,寫這個文章簡單介紹一下,希望對大家有幫助。
我編譯的版本是0.9.6h,編譯器使用VC++6.0,根據它的說明,我進行了如下的命令和操作:
1.安裝ActivePerl-5.6.1.629-MSWin32-x86-multi-thread.順利通過!
2.打開控制臺程序,在openssl解壓后的目錄下執行Perl Configure VC-WIN32命令,注意,一定要在這個目錄下執行該命令,否則找不到Configure文件,當然,你也可以指定完整的Configure文件路徑。順利通過。
3.根據openssl的幫助說明,在解壓目錄下執行ms\do_masm(和ms_\do_ms)命令,成功通過。
4.配置VC環境變量,我在相同的控制臺程序下轉到VC所在目錄下的vc98\bin目錄,執行vcvars32批處理命令,設置VC的環境變量,然后再轉到openssl解壓包的根目錄下。
注意:我第一次運行Vcvars32的時候,報錯,錯誤為:Out of environment space,這個錯誤的產生是因為你的MS-DOS環境變量沒有分配足夠的內存,這可以通過如下方法解決:
a.點擊開始, 點擊運行.
b.輸入sysedit后回車運行該程序.
c.然后會出現多個窗口,選擇Config.sys窗口.
d.如果存在Shell= 的語句, 在其前面輸入 REM ,即注釋該語句.
e.如果該語句不存在,就直接輸入SHELL=C:\COMMAND.COM /E:4096 /P ,注意,要保證該語句是從第一行第一個位置開始輸入的。
f.保存、退出重新啟動電腦就應該可以解決這個問題。
按上述方法解決這個問題之后,重新啟動電腦后可以直接執行第4步。
5.在openssl解壓目錄下執行nmake -f ms\ntdll.mak,如果沒有錯誤,就完成編譯了。輸出的文件在out32dll里面,包括應用程序的可執行文件、兩個Lib文件和兩個dll文件。
我根據openssl的說明,做了兩種不通的編譯,一直是加了ASM匯編語言編譯器,一直是沒有,即在第三步的時候執行do_masm或do_ms命令,時間上前者大概為3分鐘(我的電腦配置是圖拉丁塞楊1.2,內存256SDRM),后者大概是6分鐘的樣子。
然后,我使用了第三方提供的一個編譯方法,該方法自動配置了openssl各個模塊的V虛擬C工程連接配置項目,然后再進行編譯,速度很慢,用了至少20分鐘以上的時間,但是好處是可以將一個一個項目弄的比較清楚,其編譯過程我就不說了,大家可以參看相關的文檔。
certmgr.dll - 證書圖標
shell32.dll
comres.dll - COM圖標
EvpClean()函數說明,此函數在程序銷毀時候調用,否則在一個函數中調用過,即使下一個函數中重新加載了算法,也可能出現沒有加密庫的錯誤.
關于類型轉換:
1. static_cast
將一個值以合邏輯的方式轉型.這可看做是"利用原值重建一個臨時對象,并在設
立初值時使用型別轉換".唯有當上述的型別轉換有所定義,整個轉換才會成功.
所謂的"有所定義",可以是語言內建規則,也可以是程序員自定的轉換動作.
例如:
float x;
...
cout << static_cast(x); // print x as int
...
f(static_cast("hello")); // call f() for string instead of char*
2. dynamic_cast
將多態型別(polymorphic type)向下轉型(downcast)為其實際靜態型別(real static
type).這是唯一在執行期進行檢驗的轉型動作.你可以用它來檢驗某個多態對象
的型別,例如:
class Car; // abstract base class (has at least one virtual function)
class Cabriolet : public Car {
...
};
class Limousine : public Car {
...
};
void f(Car* cp)
{
Cabriolet* p = dynamic_cast(cp);
if (p == NULL) {
// did not refer to an object of type Cabriolet
...
}
}
在這個例子中,面對實際靜態型別為Cabriolet的對象,f()有特殊應對行為.當
參數是個reference,而且型別轉換失敗時,dynamic_cast丟出一個bad_cast異
常(bad_cast的描述見p26).注意,以設計角度而言,你應該在運用多態技術的
程序中,避免這種 "程序行為取決于具體型別"的寫法.
3. const_cast
設定或去除型別的常數性(constness),亦可去除volatile飾詞.除此之外不允
許任何轉換.
4. reinterpret_cast
此操作符的行為由實際編譯器定義.可能重新解釋bits意義,但也不一定如此.使
用此一轉型動作通常帶來不可移植性.
這些操作符取代了以往小圓括號所代表的舊式轉型,能夠清楚闡明轉型的目的.小圓括
號轉型可替換dynamic_cast之外的其它三種轉型,也因此當你運用它時,你無法明
確顯示使用它的確切理由.這些新式轉型操作符給了編譯器更多信息,讓編譯器清楚知
道轉型的理由,并在轉型失敗時釋出一份錯誤報告.
注意,這些操作符都只接受一個參數.試看以下例子:
static_cast(15,100) // Oops, creates Fraction(100)
在這個例子中你得不到你想要的結果.它只用一個數值100,將Fraction 暫時對象
設定初值,而非設定分子15,分母100.逗號在這里并不起分隔作用,而是形成一個
comma(逗號)操作符,將兩個表達式組合為一個表達式,并傳回第二表達式做為最終
結果.將15和100"轉換"為分數的正確做法是:
Fraction(15,100) // fine, creates Fraction(15,100)
CImageList::SetOverlayImage可以設置重疊圖標,比如在一個圖標上面加上一個感嘆號
//隱藏不活動圖標
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -