Visual Studio 2015编译wxWidgets
Posted yuanxiaoping_21cn_com
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Visual Studio 2015编译wxWidgets相关的知识,希望对你有一定的参考价值。
宫指导说,换帅如换刀
程序员的编译器一换,基本套路必须都重练几次
使用wxWidgets并不难,但不能使用现有的库和工程配置文件,细节就必须理清楚
获取wxWidgets
官方的下载页面,下7z或zip文件均可
文件“wxWidgets根目录/docs/msw/install.txt”是编译说明文档,可以作为参考
添加环境变量WXWIN,值是wxWidgets根目录的路径。虽然不添加变量也可以编译,但很多wxWidgets插件的编译都依赖这个环境变量,因此最好加上。
wxWidgets根目录的路径不要含有空格
增加vs2015支持
vs2015影响编译的改动,主要是定义了snprintf,以及编译器版本升级到14。
需要对wxWidgets作如下修改,才能使用vs2015进行编译。
%WXWIN%includemsvcwxsetup.h,66行,增加版本支持
#elif _MSC_VER == 1900 #define wxCOMPILER_PREFIX vc140
%WXWIN%includewxcompiler.h,56行,增加版本支持
#elif __VISUALC__ < 2000 #define __VISUALC14__
在下面三个文件中,找到snprintf的宏定义,注释掉
- %WXWIN%src ifflibtiff if_config.h
- %WXWIN%src ifflibtiff if_config.vc.h
- %WXWIN%srczlibgzguts.h
编译库文件
运行“开始|所有程序|visual studio 2015|visual studio tools|VS2015 开发人员命令提示”
切换到%WXWIN%uildmsw
32位静态库DEBUG版
nmake /f makefile.vc
库文件生成在%WXWIN%libvc_lib,文件名含d表示debug版
32位静态库RELEASE版
nmake /f makefile.vc BUILD=release
库文件生成在%WXWIN%libvc_lib,文件名不含d与debug版区分
32位动态库DEBUG版
nmake /f makefile.vc SHARED=1
库文件生成在%WXWIN%libvc_dll,文件名含d表示debug版
32位动态库RELEASE版
nmake /f makefile.vc BUILD=release SHARED=1
库文件生成在%WXWIN%libvc_dll,文件名不含d与debug版区分
运行“开始|所有程序|visual studio 2015|visual studio tools|Windows Desktop Command Prompts|VS2015 x64 本机工具命令提示符”
切换到%WXWIN%uildmsw
64位静态库DEBUG版
nmake /f makefile.vc TARGET_CPU=X64
库文件生成在%WXWIN%libvc_x64_lib,文件名含d表示debug版
64位静态库RELEASE版
nmake /f makefile.vc BUILD=release TARGET_CPU=X64
库文件生成在%WXWIN%libvc_x64_lib,文件名不含d与debug版区分
64位动态库DEBUG版
nmake /f makefile.vc SHARED=1 TARGET_CPU=X64
库文件生成在%WXWIN%libvc_x64_dll,文件名含d表示debug版
64位动态库RELEASE版
nmake /f makefile.vc BUILD=release SHARED=1 TARGET_CPU=X64
库文件生成在%WXWIN%libvc_x64_dll,文件名不含d与debug版区分
“Hello world”之
官方源码
// wxWidgets "Hello world" Program // For compilers that support precompilation, includes "wx/wx.h". #include <wx/wxprec.h> #ifndef WX_PRECOMP #include <wx/wx.h> #endif class MyApp : public wxApp { public: virtual bool OnInit(); }; class MyFrame : public wxFrame { public: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); private: void OnHello(wxCommandEvent& event); void OnExit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); wxDECLARE_EVENT_TABLE(); }; enum { ID_Hello = 1 }; wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_Hello, MyFrame::OnHello) EVT_MENU(wxID_EXIT, MyFrame::OnExit) EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) wxEND_EVENT_TABLE() wxIMPLEMENT_APP(MyApp); bool MyApp::OnInit() { MyFrame *frame = new MyFrame("Hello World", wxPoint(50, 50), wxSize(450, 340)); frame->Show(true); return true; } MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size) { wxMenu *menuFile = new wxMenu; menuFile->Append(ID_Hello, "&Hello... Ctrl-H", "Help string shown in status bar for this menu item"); menuFile->AppendSeparator(); menuFile->Append(wxID_EXIT); wxMenu *menuHelp = new wxMenu; menuHelp->Append(wxID_ABOUT); wxMenuBar *menuBar = new wxMenuBar; menuBar->Append(menuFile, "&File"); menuBar->Append(menuHelp, "&Help"); SetMenuBar(menuBar); CreateStatusBar(); SetStatusText("Welcome to wxWidgets!"); } void MyFrame::OnExit(wxCommandEvent& event) { Close(true); } void MyFrame::OnAbout(wxCommandEvent& event) { wxMessageBox("This is a wxWidgets‘ Hello world sample", "About Hello World", wxOK | wxICON_INFORMATION); } void MyFrame::OnHello(wxCommandEvent& event) { wxLogMessage("Hello world from wxWidgets!"); }
静态库DEBUG方案的编译
“工程属性|C/C++|常规|附加包含目录”,添加
%WXWIN%include
“工程属性|链接器|常规|附加库目录”,添加
%WXWIN%libvc_lib
“工程属性|链接器|输入|附加依赖项”,添加
wxbase30ud.lib wxbase30ud_net.lib wxbase30ud_xml.lib wxexpatd.lib wxjpegd.lib wxmsw30ud_adv.lib wxmsw30ud_aui.lib wxmsw30ud_core.lib wxmsw30ud_gl.lib wxmsw30ud_html.lib wxmsw30ud_media.lib wxmsw30ud_propgrid.lib wxmsw30ud_qa.lib wxmsw30ud_ribbon.lib wxmsw30ud_richtext.lib wxmsw30ud_stc.lib wxmsw30ud_webview.lib wxmsw30ud_xrc.lib wxpngd.lib wxregexud.lib wxscintillad.lib wxtiffd.lib wxzlibd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib wininet.lib
推荐用这种方式添加依赖项,而不写#pragmma comment,方便切换不同方案,代码也美观
最后5个依赖项并不属于wxWidgets,别漏了
编译运行,成功~
静态库RELEASE方案的编译
附加库目录的路径不同,要修改
依赖库的名字不同,把d去掉
动态库方案的编译
“工程属性|C/C++|预处理器|预处理器定义”,添加
WXUSINGDLL
以上是关于Visual Studio 2015编译wxWidgets的主要内容,如果未能解决你的问题,请参考以下文章
编译和链接项目时 Visual Studio 2015 挂起
可能是 Visual Studio 2015 中的 C# 编译器错误
Visual Studio 2015 和 Taywee/args 库编译问题
Visual Studio Community 2015 MFC 空项目无法编译