wxWidgets在vc2005下的配置 和 使用注意!!

一、配置:

1、下載安裝文件:汗,我找不到運行庫,好像只有SDK,這個SDK,安裝完畢後,在安裝目錄下都是源碼,需要自己編譯成可供鏈接的庫,下面說明。

2、編譯鏈接時用到的庫:
假設裝的是2.8.4的版本,我把他安裝到了:C:/Program Files/wxWidgets-2.8.4/下面:
裏面有個build/msw目錄,用VC2005打開wx.dsw, 就可以直接編譯成release的和debug的(要使用GLCANVAS的話需要把setup.h中的wxUSE_GLCANVAS設爲1)

debug編譯的結果是在安裝目錄下 lib/vc_lib產生了一系列的以d結尾的LIB文件和一個mswd文件夾。
release編譯的結果是在安裝目錄下 lib/vc_lib產生了一系列的不以d結尾的LIB文件和一個msw文件夾。
分別編譯的目的是,你以後的程序,就可以根據你需要的是release版還是debug版,分別選擇鏈接的LIB文件名。見下面3(2),裏面說明要鏈接的文件的不同。

還有一個wx_dll.dsw,這個應該是可以生成動態鏈接庫,我還沒試。

注意:build/msw目錄下生成了兩個名爲vc_msw和vc_mswd的目錄,內含有多個包含了中間生成的目標文件的目錄,佔了很大空間,可以刪掉這兩個目錄。

這裏給出別人用命令行來編譯的,而上面我用的是VC界面。

 

命令行用vc編譯wxWidgets庫的方法

=========================
首先把makefile.vc中的odbc和opengl設置爲1,如果不需要也可以不用更改
nmake -f makefile.vc UNICODE=0 BUILD=release
nmake -f makefile.vc UNICODE=0 BUILD=debug
nmake -f makefile.vc UNICODE=1 BUILD=release
nmake -f makefile.vc UNICODE=1 BUILD=debug
這樣在wxwidgets目錄的lib/vclib中會生成相應的庫文件,名稱有四個,例如wxbase28lib對應
wxbase28.lib, wxbase28d.lib, wxbase28u.lib, wxbase28ud.lib
同時生成四個子目錄,分別爲msw, mswd, mswu, mswud

3、VC工程設置:

(1) 添加頭文件和庫文件的查找路徑: 所有的設置,都可以即添加在 “工具” -> “選項”中,這樣對所有的工程都起效,也可以添加在“項目”-> “屬性”中,這樣對本項目有效。因爲頭文件和庫文件,可能被多個工程用到,所以,我添加在了“工具”-> “選項”中的“項目和解決方案”下的“VC++目錄”中,

包含文件路徑:填入你安裝wxWidgets的目錄下的 include 和 include/msvc 兩個目錄。

庫文件路徑:填入你安裝wxWidgets的目錄下的 lib/vc_lib 目錄。

提醒注意的是 —— 上面的不同路徑中,如果有同名的庫,你要自己調整路徑,因爲排在前面的優先。

(2) 添加編譯時需要的庫:這個不是所有的工程都是wxWidgets工程,所以,把下面的內容添加到“項目”-> “屬性”-> “配置屬性” -> “鏈接器”->“輸入”-> “附加依賴項”中。

如果要編譯 debug的,添加:

 

--------------------- wxWidgets的庫----------------------
wxbase28d.lib
wxbase28d_net.lib
wxbase28d_odbc.lib
wxbase28d_xml.lib
wxexpatd.lib
wxjpegd.lib
wxmsw28d_adv.lib
wxmsw28d_aui.lib
wxmsw28d_core.lib
wxmsw28d_dbgrid.lib
wxmsw28d_gl.lib
wxmsw28d_html.lib
wxmsw28d_media.lib
wxmsw28d_qa.lib
wxmsw28d_richtext.lib
wxmsw28d_xrc.lib
wxpngd.lib
wxregexd.lib
wxtiffd.lib
wxzlibd.lib

----------------------- wxWidgets 依賴的庫 ------------------------------

kernel32.lib
user32.lib
gdi32.lib
comdlg32.lib
winspool.lib
winmm.lib
shell32.lib
comctl32.lib
ole32.lib
oleaut32.lib
uuid.lib
rpcrt4.lib
advapi32.lib
wsock32.lib
ws2_32.lib
odbc32.lib



如果要編譯 release的,添加:

------------------------ wxWidgets 的庫 -----------------------------
wxbase28.lib
wxbase28_net.lib
wxbase28_odbc.lib
wxbase28_xml.lib
wxexpat.lib
wxjpeg.lib
wxmsw28_adv.lib
wxmsw28_aui.lib
wxmsw28_core.lib
wxmsw28_dbgrid.lib
wxmsw28_gl.lib
wxmsw28_html.lib
wxmsw28_media.lib
wxmsw28_qa.lib
wxmsw28_richtext.lib
wxmsw28_xrc.lib
wxpng.lib
wxregex.lib
wxtiff.lib
wxzlib.lib
---------------------- wxWidgets依賴的庫 ---------------------------

kernel32.lib
user32.lib
gdi32.lib
comdlg32.lib
winspool.lib
winmm.lib
shell32.lib
comctl32.lib
ole32.lib
oleaut32.lib
uuid.lib
rpcrt4.lib
advapi32.lib
wsock32.lib
ws2_32.lib
odbc32.lib


4、其他注意:
新建的工程,需要對debug和release,都在 “Project” ---- “xxx Properties" ---- "Configuration Properties" ---- "General" ---- "Character Set"中,選擇No Set.
這是因爲: 上面沒有編譯 Unicode版本的庫,然後如果編譯好了的話,會在lib/vc_lib下生成unicode版本的庫,以及mswu(非debug)和mswud(debug版本)目錄。這樣纔可以在這裏選擇Unicode。我沒用unice,隨便。

 

二、使用注意:
1、一般還要添加系統的一些庫,才能鏈接通過,因爲你編譯的庫也多半依賴於系統的庫(但是爲什麼在linux下就不需要這樣,沒搞明白),你看上面再填寫庫的時候,加上了系統的好多庫。
2、一定要保證windows的頭文件在最最前面!!
#ifndef WIN32
#include <netinet/in.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
#endif // WIN32
像這個,就是這樣的,我當時放到了中間,windows不滿意了,報了無窮的錯誤。

還有,如果有工程自動給你生成的#include </"頭文件>/",一般只能放在最上面,就是你添加的時候,在下面添加就好了。
我遇到的一個錯誤是Sleep()找不到,然後我添加 #include <windows.h>,結果只能放在系統的 #include "stdafx.h"的下面才行。
3、即使windows的頭文件放到了最前面,還要注意,多個頭文件的時候,是有順序的,這個我暫時沒有遇到。

4、“同種類鏈接”的規則:
VC的默認代碼生成總類有兩大類:一是release,二是debug。首先鏈接的話,release的只能和release方式編譯的庫連,debug的只能和debug方式編譯的庫連。然後,在release/debug內部,又有幾個小類型,同樣的,必須同類型才能相連。這主要是:“鏈接MFC該怎麼鏈” 和 “鏈接其他的C/C++該怎麼鏈”。

“鏈接MFC該怎麼鏈”:在Project -> xx Properties -> Configuration Properties -> General -> Use of MFC 這裏面選擇 以 “靜態庫” 還是以 “DLL”。

“鏈接其他的C/C++該怎麼鏈”:在Project -> xx Properties -> Configuration Properties -> C/C++ -> Code Generation -> Runtime Library。這裏面有四種類型 /MT /MD 和其 Debug版 /MTd /MDd。他們都表示多線程的庫。/MT表示鏈接靜態的,/MD表示鏈接動態的。

舉例:你想編譯靜態鏈接的可執行文件,那麼首先庫和程序都要選擇一個大類,比如是release,然後在庫和程序所在的工程中,都要選擇“鏈接MFC該怎麼鏈”爲靜態 和 “鏈接其他的C/C++該怎麼鏈”爲/MT。

5、如果收到什麼庫衝突的錯,多半是4沒做好,但是有帖子給出下面,暫時沒明白:

默認庫“library”與其他庫的使用衝突;使用 /NODEFAULTLIB:library

您試圖與不兼容的庫鏈接。
重要事項 運行時庫現在包含防止混合不同類型的指令。如果試圖在同一個程序中使用不同類型的運行時庫或使用調試和非調試版本的運行時庫,則將收到此警告。例如,如果編譯一個文件以使用一種運行時庫,而編譯另一個文件以使用另一種運行時庫(例如單線程運行時庫對多線程運行時庫),並試圖鏈接它們,則將得到此警告。應將所有源文件編譯爲使用同一個運行時庫。有關更多信息,請參閱使用運行時庫(/MD、/ML、/MT、/LD)編譯器選項。
可以使用鏈接器的 /VERBOSE:LIB 開關來確定鏈接器搜索的庫。如果收到 LNK4098,並想創建使用如單線程、非調試運行時庫的可執行文件,請使用 /VERBOSE:LIB 選項確定鏈接器搜索的庫。鏈接器作爲搜索的庫輸出的應是 LIBC.lib,而非 LIBCMT.lib、MSVCRT.lib、LIBCD.lib、LIBCMTD.lib 和 MSVCRTD.lib。對每個要忽略的庫可以使用 /NODEFAULTLIB,以通知鏈接器忽略錯誤的運行時庫。

下表顯示根據要使用的運行時庫應忽略的庫。
若要使用此運行時庫 請忽略這些庫
單線程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
多線程 (libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
使用 DLL 的多線程 (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
調試單線程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
調試多線程 (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
使用 DLL 的調試多線程 (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib

例如,如果收到此警告,並希望創建使用非調試、單線程版本的運行時庫的可執行文件,可以將下列選項與鏈接器一起使用:
/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib

6. 程序的發佈:

 

VC2005項目發佈相關問題
==================
VC2005+wxWidgets寫的程序,在開發機器上可以運行,在其它用戶的機器上可能無法運行,
原因在於VC2005使用winSxS機制(具體內容可以Google),用listdlls看運行的程序,會發現有:


(1)、配置 release 使用動態庫:
配置工程屬性: “在共享DLL中使用MFC” + "/MD",見4點。所有依賴的工程(庫)都按照這樣配。
這樣下來我那次做的,需要拷貝3個系統文件(除了你自己依賴的第三方庫以外):
msvcp80.dll C:/WINDOWS/WinSxS/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.163_x-ww_681e29fb/msvcp80.dll
msvcr80.dll C:/WINDOWS/WinSxS/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.163_x-ww_681e29fb/msvcr80.dll
Microsoft.VC80.CRT.manifest        C:/Program Files/Microsoft Visual Studio 8/VC/redist/x86/Microsoft.VC80.CRT/Microsoft.VC80.CRT.manifest

找到他們的方法:
a、可以通過在VC8中時,運行你的工程創建的程序,然後在下面的的“模塊”窗口或“輸出”窗口裏面,能看到加載的DLL的全路徑。
但是,其實不知道爲什麼,dll不是所有都要。拷了它指明的路徑下的兩個,即msvcp80.dll 和 msvcr80.dll,這兩個是必須的。另外,

Microsoft.VC80.CRT.manifest也是必須的,雖然沒有指出,它在VC8的安裝路徑裏。
b、可以用 listdlls 這個程序,這個程序用於:當沒有工程文件時,只有exe時,可以列出它所依賴的dll,輸出和a的一摸一樣。

注意: 快捷的方法 —— 實際上,只需要找到 Microsoft.VC80.CRT.manifest 所在的地方,那個文件夾下也有 msvcp80.dll 和 msvcr80.dll!
(2)、配置debug 使用動態庫:
配置工程屬性: “在共享DLL中使用MFC” + "/MDd",見4點。所有依賴的工程(庫)都按照這樣配。
然後找到依賴的,方法同上,就不列出了。
只不過注意,這次的是 Microsoft.VC80.DebugCRT.manifest 在 C:/Program Files/Microsoft Visual Studio 8/VC/redist/Debug_NonRedist/x86

/Microsoft.VC80.DebugCRT 下。而msvcp80.dll 變成了 msvcp80d.dll,msvcr80.dll 變成了 msvcr80d.dll

(3)、配置release使用靜態庫:
配置工程屬性: “在靜態庫中使用MFC” + "/MT",見4點。所有依賴的工程(庫)都按照這樣配。
這樣編譯下來,果然不需要任何dll了。(但是第三方庫不一定,裏面有些小細節還不清楚,反正系統的是不用了,比如上面的msvc**和manifest)
(4)、配置debug使用靜態庫:沒試,應該沒問題。

發佈了67 篇原創文章 · 獲贊 3 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章