vs2008 安装 wxwidgets 出现的问题

vs2008安装 wxwidgets         : error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 

 

1,.菜单中选择 Project->Properties, 弹出Property Pages窗口
2,Configuration Properties->C/C++->Preprocessor,然后在右边栏的Preprocessor Definitions对应的项中删除_CONSOLE, 添加_WINDOWS.(如果有WIND32的话也要把WIND32删除,_如果有DEBUG可以不管它)
3,Configuration Properties->Linker->System,然后在右边栏的SubSystem对应的项改为Windows(/SUBSYSTEM:WINDOWS)

 

 

一、下载并解压缩wxWidgets
1. 到 http://www.wxwidgets.org/downloads 下载一个wxMSW版本的wxWidgets。(wxMSW是专门针对Windows系统)

  PS:这里推荐解压缩 版:http://prdownloads.sourceforge.net/wxwindows/wxMSW-2.8.10.zip

2. 把下载的wxMSW-2.8.10.zip解压缩到C盘。(wxWidgets的安装路径最好不要出现空格和中文)

  例 如:C:/wxMSW-2.8.10

二、编译wxWidgets
1. 进入“C:/wxMSW-2.8.10/build/msw”目录。用VS2008打开wx.dsw,提示是否进行项目转换,点确定。

2. 编译Debug版本的库右击《解决方案->配置管理器->活动解决方案配置 ->Unicode Debug》。然后右击《解决方案->生成解决方案》,等一会儿就可以编译出Debug版本的wxWidgets库了。

3. 编 译Relase版本的库Release版本的wxWidgets库虽然也可以通过类似的方法去编译,但编译 出来的库仍然依赖于visual studio 2008的运行时库。Debug版本的库依赖VS2008也就算了,反正是自己调试用的。Release版本可是要给别人用的,再带上一大堆dll就不好 了。为了解决这个问题,我们需要先(解决方案->配置管理器->活动解决方案配置->Unicode Release),然后在解决方案资源管理器中,针对每一个项目右击《属性->配置属性->C/C++ ->代码生成->运行时库: 多线程(/MT)》(HOHO, 有20个项目要改属性啊~~~)。最后再右击《解决方案->生成解决方案》就可以了。

编译好后的wxWidgets会在 C:/wxMSW-2.8.10/lib/vc_lib目录下生成一系列的lib文件,这些lib文件的名字遵循下面的命 名规则:不依赖于GUI组件的库会以"wxbase"开头,紧跟着的是版本号,然后的字母表明这个库是否是编译为Unicode('u')或是否是编译为 Debug('d'),名字中的最后部分是wxWidgets组件的名字。
注意:wxWidgets编译完后在C:/wxMSW- 2.8.10/build/msw目录下会生成许多预编译头文件,占了很大的空间,如果确定以后不再编译 wxWidgets库的话,可以考虑删掉。

三、配置VS2008

  1. 打开工具 -> 选项 -> 项目和解决方案 -> VC++目录 -> 显示以下内容的目录
2. 在“包含文件”中加入“C:/wxMSW-2.8.10/include”和“C:/wxMSW-2.8.10/include/msvc”
3. 在“库文件” 中加入“C:/wxMSW-2.8.10/lib/vc_lib”

四、创建 wxWidgets项目

  新建一个空项目。然后设置项目的一些属性,可以选择下面的其中一 个来设置。譬如你如果打算使用Unicode,那么选择Unicode Debug或Unicode Release,如果你仅仅想调试程序而非发布,则只需要选择Debug设置。

Debug:
项目->属性 ->配置属性->常规 -> 字符集: 未设置
项目->属性->配置属性->C/C++ -> 代码生成 ->运行时库: 多线程调试(/MTd)
项目->属性->配置属性->链接器 -> 输入 -> 附加依赖项: wxbase28d.lib wxmsw28d_core.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib

Release:
项目->属性 ->配置属性->常规->字符集: 未设置
项目->属性->配置属性->C/C++ ->代码生成->运行时库: 多线程(/MT)
项目->属性->配置属性->链接器->输入-> 附加依赖项: wxbase28.lib wxmsw28_core.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib

Unicode Debug:
项目->属性 -> 配置属性 -> 常规 -> 字符集: 使用 Unicode 字符集
项目->属性 -> 配置属性 -> C/C++ -> 代码生成 ->运行时库: 多线程调试(/MTd)
项目->属性 -> 配置属性 -> 链接器 -> 输入 -> 附加依赖项: wxbase28ud.lib wxmsw28ud_core.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib

Unicode Release:
项目->属性 -> 配置属性 -> 常规 -> 字符集: 使用 Unicode 字符集
项目->属性 -> 配置属性 -> C/C++ -> 代码生成 ->运行时库: 多线程(/MT)
项 目->属性 -> 配置属性 -> 链接器 -> 输入 -> 附加依赖项: wxbase28u.lib wxmsw28u_core.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib

这些静态链接库都是一 些可能会使用到的 Windows 系统的库,根据需要增减,比如我从来不用odbc,就不需要在这里添加 odbc32.lib。而 wxWidgets 的静态库会自动添加到工程中,不需要在这里设置,在 %WXPATH%/include/msvc/wx/setup.h 文件中可以看到加载这些库的代码。

编译成依赖 DLL 的执行文件还需要加上预处理指令 WXUSINGDLL
用 UNICODE 编译则需要加上预处理指令 _UNICODE
还有一种 Universal 编译,要加上预处理指令 __WXUNIVERSAL__
这样一个普通的 wxWdigets 项目就设置好了。

 

复制以下代 码添加到你的CPP文件中,进行编译,测试,OK!

代码
/////////////////////////////////////////////////////////////////////////// //
//  Name:        minimal.cpp
//  Purpose:     Minimal wxWidgets sample
//  Author:      Julian Smart
//  Modified by:
//  Created:     04/01/98
//  RCS-ID:      $Id: minimal.cpp 43915 2006-12-11 09:33:34Z CE $
//  Copyright:   (c) Julian Smart
//  Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////// //

//  ============================================================================
//  declarations
//  ============================================================================

//  ----------------------------------------------------------------------------
//  headers
//  ----------------------------------------------------------------------------

//  For compilers that support precompilation, includes "wx/wx.h".
#include  " wx/wxprec.h "

#ifdef __BORLANDC__
#pragma  hdrstop
#endif

//  for all others, include the necessary headers (this file is usually all you
//  need because it includes almost all "standard" wxWidgets headers)
#ifndef WX_PRECOMP
#include 
" wx/wx.h "
#endif

//  ----------------------------------------------------------------------------
//  resources
//  ----------------------------------------------------------------------------

//  the application icon (under Windows and OS/2 it is in resources and even
//  though we could still include the XPM here it would be unused)
#if  !defined(__WXMSW__) && !defined(__WXPM__)
#include 
" ../sample.xpm "
#endif

//  ----------------------------------------------------------------------------
//  private classes
//  ----------------------------------------------------------------------------

//  Define a new application type, each program should derive a class from wxApp
class  MyApp :  public  wxApp
{
public :
//  override base class virtuals
//  ----------------------------

//  this one is called on application startup and is a good place for the app
//  initialization (doing it here and not in the ctor allows to have an error
//  return: if OnInit() returns false, the application terminates)
     virtual   bool  OnInit();
};

//  Define a new frame type: this is going to be our main frame
class  MyFrame :  public  wxFrame
{
public :
//  ctor(s)
    MyFrame( const  wxString &  title);

//  event handlers (these functions should _not_ be virtual)
     void  OnQuit(wxCommandEvent &   event );
void  OnAbout(wxCommandEvent &   event );

private :
//  any class wishing to process wxWidgets events must use this macro
    DECLARE_EVENT_TABLE()
};

//  ----------------------------------------------------------------------------
//  constants
//  ----------------------------------------------------------------------------

//  IDs for the controls and the menu commands
enum
{
//  menu items
    Minimal_Quit  =  wxID_EXIT,

//  it is important for the id corresponding to the "About" command to have
//  this standard value as otherwise it won't be handled properly under Mac
//  (where it is special and put into the "Apple" menu)
    Minimal_About  =  wxID_ABOUT
};

//  ----------------------------------------------------------------------------
//  event tables and other macros for wxWidgets
//  ----------------------------------------------------------------------------

//  the event tables connect the wxWidgets events with the functions (event
//  handlers) which process them. It can be also done at run-time, but for the
//  simple menu events like this the static method is much simpler.
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(Minimal_Quit,  MyFrame::OnQuit)
EVT_MENU(Minimal_About, MyFrame::OnAbout)
END_EVENT_TABLE()

//  Create a new application object: this macro will allow wxWidgets to create
//  the application object during program execution (it's better than using a
//  static object for many reasons) and also implements the accessor function
//  wxGetApp() which will return the reference of the right type (i.e. MyApp and
//  not wxApp)
IMPLEMENT_APP(MyApp)

//  ============================================================================
//  implementation
//  ============================================================================

//  ----------------------------------------------------------------------------
//  the application class
//  ----------------------------------------------------------------------------

//  'Main program' equivalent: the program execution "starts" here
bool  MyApp::OnInit()
{
//  call the base class initialization method, currently it only parses a
//  few common command-line options but it could be do more in the future
     if  (  ! wxApp::OnInit() )
return   false ;

//  create the main application window
    MyFrame  * frame  =   new  MyFrame(_T( " Minimal wxWidgets App " ));

//  and show it (the frames, unlike simple controls, are not shown when
//  created initially)
    frame -> Show( true );

//  success: wxApp::OnRun() will be called which will enter the main message
//  loop and the application will run. If we returned false here, the
//  application would exit immediately.
     return   true ;
}

//  ----------------------------------------------------------------------------
//  main frame
//  ----------------------------------------------------------------------------

//  frame constructor
MyFrame::MyFrame( const  wxString &  title)
: wxFrame(NULL, wxID_ANY, title)
{
//  set the frame icon
    SetIcon(wxICON(sample));

#if  wxUSE_MENUS
//  create a menu bar
    wxMenu  * fileMenu  =   new  wxMenu;

//  the "About" item should be in the help menu
    wxMenu  * helpMenu  =   new  wxMenu;
helpMenu
-> Append(Minimal_About, _T( " &About.../tF1 " ), _T( " Show about dialog " ));

fileMenu
-> Append(Minimal_Quit, _T( " E&xit/tAlt-X " ), _T( " Quit this program " ));

//  now append the freshly created menu to the menu bar...
    wxMenuBar  * menuBar  =   new  wxMenuBar();
menuBar
-> Append(fileMenu, _T( " &File " ));
menuBar
-> Append(helpMenu, _T( " &Help " ));

//  ... and attach this menu bar to the frame
    SetMenuBar(menuBar);
#endif   //  wxUSE_MENUS

#if  wxUSE_STATUSBAR
//  create a status bar just for fun (by default with 1 pane only)
    CreateStatusBar( 2 );
SetStatusText(_T(
" Welcome to wxWidgets! " ));
#endif   //  wxUSE_STATUSBAR
}


//  event handlers

void  MyFrame::OnQuit(wxCommandEvent &  WXUNUSED( event ))
{
//  true is to force the frame to close
    Close( true );
}

void  MyFrame::OnAbout(wxCommandEvent &  WXUNUSED( event ))
{
wxMessageBox(wxString::Format(
_T(
" Welcome to %s!/n " )
_T(
" /n " )
_T(
" This is the minimal wxWidgets sample/n " )
_T(
" running under %s. " ),
wxVERSION_STRING,
wxGetOsDescription().c_str()
),
_T(
" About wxWidgets minimal sample " ),
wxOK 
|  wxICON_INFORMATION,
this );
}

 

 

错 误处理:
1. 在编译时出现了Cannot open include file: '../mswu/wx/setup.h': No such file or directory错误
这是因为项目属性的 Character Set设置不正确,必须与使用的wxWidgets库的Character Set一致。
2. 在编译时出现了MSVCRT.lib(MSVCRT.dll) : error LNK2005: _free already defined in LIBC.lib(free.obj)
这是因为没有连接正确的wxWidgets库,譬如Unicode Debug版本的项目就需要连接Unicode+Debug版本的wxWidgets库(库名后缀为'ud'的lib文件)。或者是wxWidgets和 Application使用的Runtime Library不相同。
3. 运行是出现No Debugging Information对话框
将Project Properties -> Linker -> Debugging -> Generate Debug Info的值改成Yes (/DEBUG)。

原文:http://www.cnblogs.com/princelive/archive/2010/04/12/1710437.html

PS:虽然2.90版本已经有了些许变化,但是影响不大,大体过程还是一样的,因此依样画葫芦即可。另外大家也不必手动的去添加lib到项目中,只需要包含头文件wx/Setup.h即可,该文件会自动的帮我们导入.lib,注意一点,静态库编译的lib文件和动态链接库的lib文件时不同的,如果你分别能找到对应的lib,但是又有链接错误,那么请检查链接到的lib是否是对应的lib,可以用宏WXUSINGDLL来让系统寻找DLL的Lib。

 

 

error LNK2005: _exit 已经在 LIBCMTD.lib(crt0dat.obj) 中定义
 设置工程属性:C/C++/代码生成/运行库 这一项的选项为多线程DLL (/MD),如还有错误,可以试选其

它几项。

你可能感兴趣的:(vs2008 安装 wxwidgets 出现的问题)