您的位置:首页 > 其它

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

2009-08-27 21:19 393 查看
一、配置:

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使用静态库:没试,应该没问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: