WxWidget多平台交叉编译环境搭建

时间:2021-04-22 09:28:16

wxWidget作为知名的跨平台界面开发框架,已经有相当长的历史了,最近利用业余时间研究了wxWidget框架在Ubuntu下的开发方法,其中搭建开发环境走了一些弯路,参考了网上不少好文,总算尘埃落定,不敢独享,把搭建步骤记录于此,希望给有同样研究兴趣的同学一个参考。

那么现在开始...

开始之前需要安装:

                 C++ 基本开发环境:sudo apt-get install build-essential
                    安装X11库文件:sudo apt-get install libx11-dev
            安装GTK需要的一堆东西:sudo apt-get install gnome-core-devel
 安装minGW32,windows交叉编译工具:sudo aptitude install -y mingw32 mingw32-binutils mingw32-runtime gcc-mingw32

说明:因为我搭建的环境预备用来编译gtk,x11和msw(MS Windows)三个平台的代码,所以需要先安装这三种平台的交叉编译工具,如果还要编译其他平台的程序,就还得安装其他平台的编译工具。


以下为配置步骤:


1. 从wxWidget官方网站下载源代码包wxAll版本,次级版本号为双数的是稳定版本(目前是2.8.12),单数是最新开发版(2.9.4),一般而言不够稳定,我们下载稳定版:

    wxWidgets-2.8.12.tar.gz( http://www.wxwidgets.org/downloads/

解压到/home/youxin/code/wxWidgets-2.8.12,作为程序根目录:

    tar -xzvf wxWidgets-2.8.12.tar.gz

2.在程序根目录wxWidgets-2.8.12下,建立各平台文件夹,目前建立了一下三个:

    build28-gtk-ud     //存放gtk平台文件
    build28-x11-ud     //存放x11平台文件
    build28-msw-ud     //存放MS Windows平台文件

自己定的目录命名规则,u代表开启unicode,d代表开启debug, s代表开启shared lib, 没有这些字母表示不开启 如果后续要建立gtk平台unicode, release版本,连接动态库的编译环境,则目录名为build28-gtk-urs

一下三步参考《Cross-Platform GUI Programming with wxWidgets EN.chm》Appendix A:installing wxWidgets--Linux,Unix, and Mac OS X, GCC

3.编译和配置gtk环境:

       cd  build28-gtk-ud 
       sudo ../configure --with-gtk --enable-unicode --enable-debug --disable-shared //该步骤在当前目录下生成平台的各种文件
        //上一指令隐含参数--build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
       sudo make              //编译平台库文件 
       sudo make install      //将库文件安装到/usr/local/lib,其他用户可以共享使用;将当前配置wx-config拷贝到usr/local/bin,作为默认编译配置
       sudo ldconfig          //更新、注册新添加的动态库

4.编译和配置x11环境:

       cd  build28-x11-ud 
       sudo ../configure --with-x11 --enable-unicode --enable-debug --disable-shared
       //上一指令隐含参数--build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
       sudo make
       sudo make install
       sudo ldconfig

5.编译和配置msw环境:

       cd  build28-msw-ud 
       sudo ../configure --with-msw --host=i586-mingw32msvc --build=i686-linux --enable-unicode --enable-debug --disable-shared
       //上一指令隐含参数--target=i586-mingw32msvc
       sudo make
       sudo make install
       sudo ldconfig

以上三个步骤执行完后,每个build目录都会生成samples文件夹,里面会为每个平台生成对应的例子编译makefile文件,直接在例子的目录中执行make,可以编译出例子。

6.在任意程序目录使用默认配置编译代码,以simple.cpp为例,使用命令:

   g++ -o simple simple.cpp `wx-config --cxxflags --libs`

命令中`符号不是单引号,是ESC键下面的符号。该符号括住的命令会被命令行执行,返回值作为命令行参数。

wx-config命令返回默认的编译参数和引用库路径(--cxx参数返回编译器名,--cxflags返回编译参数,--libs返回编译依赖的库文件和库目录),wx-config存在于/usr/local/bin,由最近一次在目录build28-gtk-ud, build28-x11-ud或build28-msw-ud中执行sudo make install创建,因此编译配置由最后一次make install所在目录决定。

如果不希望用默认配置编译(希望手工选择编译目标平台),可以用一下命令:

   gtk平台:g++ -o simple_gtk simple.cpp `~/code/wxWidgets-2.8.12/build28-gtk-ud/wx-config --libs --cxxflags`
   x11平台:g++ -o simple_x11 simple.cpp `~/code/wxWidgets-2.8.12/build28-x11-ud/wx-config --libs --cxxflags`
   msw平台:i586-mingw32msvc-g++ -o simple_msw simple.cpp `~/code/wxWidgets-2.8.12/build28-msw-ud/wx-config --libs --cxxflags`

注意:在目录build28-gtk-ud, build28-x11-ud或build28-msw-ud中,命令行直接输入执行:

   wx-config --libs

实际执行的是/usr/local/bin中的版本,如果要执行目录中特定平台的版本,需要显示指定:

   ~/code/wxWidgets-2.8.12/build28-gtk-ud/wx-config --libs


附上configure脚本基本调用模式:


在建立的平台文件夹中输入:

   ../configure --enable-unicode --disable-debug --disable-shared
   
   一般对unicode,debug,shared三个选项进行enable和disable设置。

configure参数:

`configure' configures wxWidgets 2.8.12 to adapt to many kinds of systems.

Usage:

   ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:

 -h, --help              display this help and exit
     --help=short        display options specific to this package
     --help=recursive    display the short help of all the included packages
 -V, --version           display version information and exit
 -q, --quiet, --silent   do not print `checking...' messages
     --cache-file=FILE   cache test results in FILE [disabled]
 -C, --config-cache      alias for `--cache-file=config.cache'
 -n, --no-create         do not create output files
     --srcdir=DIR        find the sources in DIR [configure dir or `..']

Installation directories:

 --prefix=PREFIX         install architecture-independent files in PREFIX
                [/usr/local]
 --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                [PREFIX]

By default, `make install' will install all the files in `/usr/local/bin', `/usr/local/lib' etc. You can specify an installation prefix other than `/usr/local' using `--prefix', for instance `--prefix=$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:

 --bindir=DIR           user executables [EPREFIX/bin]
 --sbindir=DIR          system admin executables [EPREFIX/sbin]
 --libexecdir=DIR       program executables [EPREFIX/libexec]
 --datadir=DIR          read-only architecture-independent data [PREFIX/share]
 --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
 --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
 --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
 --libdir=DIR           object code libraries [EPREFIX/lib]
 --includedir=DIR       C header files [PREFIX/include]
 --oldincludedir=DIR    C header files for non-gcc [/usr/include]
 --infodir=DIR          info documentation [PREFIX/info]
 --mandir=DIR           man documentation [PREFIX/man]

X features:

 --x-includes=DIR    X include files are in DIR
 --x-libraries=DIR   X library files are in DIR

System types:

 --build=BUILD     configure for building on BUILD [guessed]
 --host=HOST       cross-compile to build programs to run on HOST [BUILD]
 --target=TARGET   configure for building compilers for TARGET [HOST]

Optional Features:

 --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
 --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
 --enable-gui            use GUI classes
 --enable-monolithic     build wxWidgets as single library
 --enable-plugins        build parts of wxWidgets as loadable components
 --enable-universal      use wxWidgets GUI controls instead of native ones
 --enable-nanox          use NanoX
 --disable-gtk2          use GTK+ 1.2 instead of 2.0
 --enable-gpe            use GNOME PDA Environment features if possible
 --enable-shared         create shared library code
 --enable-optimise       compile without optimisations
 --enable-debug          same as debug_flag and debug_info
 --enable-stl            use STL for containers
 --enable-omf            use OMF object format
 --enable-debug_flag     set __WXDEBUG__ flag (recommended for developers!)
 --enable-debug_info     create code with debugging information
 --enable-debug_gdb      create code with extra GDB debugging information
 --enable-debug_cntxt    use wxDebugContext
 --enable-mem_tracing    create code with memory tracing
 --enable-profile        create code with profiling information
 --enable-no_rtti        create code without RTTI information
 --enable-no_exceptions  create code without C++ exceptions handling
 --enable-permissive     compile code disregarding strict ANSI
 --enable-no_deps        create code without dependency information
 --disable-vararg_macros don't use vararg macros, even if they are supported
 --enable-universal_binary  create Mac PowerPC and Intel Universal binary
 --enable-compat24       enable wxWidgets 2.4 compatibility
 --disable-compat26      disable wxWidgets 2.6 compatibility
 --disable-rpath         disable use of rpath for uninstalled builds
 --enable-objc_uniquifying enable Objective-C class name uniquifying
 --enable-abi-incompatible-features Enables features that break ABI compatibility
 --enable-intl           use internationalization system
 --enable-config         use wxConfig (and derived) classes
 --enable-protocols      use wxProtocol and derived classes
 --enable-ftp            use wxFTP (requires wxProtocol
 --enable-http           use wxHTTP (requires wxProtocol
 --enable-fileproto      use wxFileProto class (requires wxProtocol
 --enable-sockets        use socket/network classes
 --enable-ole            use OLE classes (Win32 only)
 --enable-dataobj        use data object classes
 --enable-ipc            use interprocess communication (wxSocket etc.)
 --enable-apple_ieee     use the Apple IEEE codec
 --enable-arcstream      use wxArchive streams
 --enable-backtrace      use wxStackWalker class for getting backtraces
 --enable-catch_segvs    catch signals in wxApp::OnFatalException (Unix only)
 --enable-cmdline        use wxCmdLineParser class
 --enable-datetime       use wxDateTime class
 --enable-debugreport    use wxDebugReport class
 --enable-dialupman      use dialup network classes
 --enable-dynlib         use wxLibrary class for DLL loading
 --enable-dynamicloader  use (new) wxDynamicLibrary class
 --enable-exceptions     build exception-safe library
 --enable-ffile          use wxFFile class
 --enable-file           use wxFile class
 --enable-filesystem     use virtual file systems classes
 --enable-fontmap        use font encodings conversion classes
 --enable-fs_archive     use virtual archive filesystems
 --enable-fs_inet        use virtual HTTP/FTP filesystems
 --enable-fs_zip         now replaced by fs_archive
 --enable-geometry       use geometry class
 --enable-log            use logging system
 --enable-longlong       use wxLongLong class
 --enable-mimetype       use wxMimeTypesManager
 --enable-mslu           use MS Layer for Unicode on Windows 9x (Win32 only)
 --enable-snglinst       use wxSingleInstanceChecker class
 --enable-std_iostreams  use standard C++ stream classes
 --enable-std_string     use standard C++ string classes
 --enable-stdpaths       use wxStandardPaths class
 --enable-stopwatch      use wxStopWatch class
 --enable-streams        use wxStream etc classes
 --enable-sysoptions     use wxSystemOptions
 --enable-tarstream      use wxTar streams
 --enable-textbuf        use wxTextBuffer class
 --enable-textfile       use wxTextFile class
 --enable-timer          use wxTimer class
 --enable-unicode        compile wxString with Unicode support
 --enable-sound          use wxSound class
 --enable-mediactrl      use wxMediaCtrl class
 --enable-gstreamer8     force GStreamer 0.8 instead of 0.10 with the wxMediaCtrl class on unix
 --enable-printfposparam use wxVsnprintf() which supports positional parameters
 --enable-zipstream      use wxZip streams
 --enable-url            use wxURL class
 --enable-variant        use wxVariant class
 --enable-protocol       use wxProtocol class
 --enable-protocol-http  HTTP support in wxProtocol
 --enable-protocol-ftp   FTP support in wxProtocol
 --enable-protocol-file  FILE support in wxProtocol
 --enable-threads        use threads
 --enable-docview        use document view architecture
 --enable-help           use help subsystem
 --enable-mshtmlhelp     use MS HTML Help (win32)
 --enable-html           use wxHTML sub-library
 --enable-htmlhelp       use wxHTML-based help
 --enable-xrc            use XRC resources sub-library
 --enable-aui            use AUI docking library
 --enable-constraints    use layout-constraints system
 --enable-printarch      use printing architecture
 --enable-mdi            use multiple document interface architecture
 --enable-mdidoc         use docview architecture with MDI
 --enable-loggui         use standard GUI logger
 --enable-logwin         use wxLogWindow
 --enable-logdialog      use wxLogDialog
 --enable-webkit         use wxWebKitCtrl (Mac)
 --enable-richtext       use wxRichTextCtrl
 --enable-graphics_ctx   use graphics context 2D drawing API
 --enable-postscript     use wxPostscriptDC device context (default for gtk+)
 --enable-prologio       not available; see contrib
 --enable-resources      not available; see contrib
 --enable-clipboard      use wxClipboard class
 --enable-dnd            use Drag'n'Drop classes
 --enable-metafile       use win32 metafiles
 --enable-controls       use all usual controls
 --enable-accel          use accelerators
 --enable-animatectrl    use wxAnimationCtrl class
 --enable-button         use wxButton class
 --enable-bmpbutton      use wxBitmapButton class
 --enable-bmpcombobox    use wxBitmapComboBox class
 --enable-calendar       use wxCalendarCtrl class
 --enable-caret          use wxCaret class
 --enable-checkbox       use wxCheckBox class
 --enable-checklst       use wxCheckListBox (listbox with checkboxes) class
 --enable-choice         use wxChoice class
 --enable-choicebook     use wxChoicebook class
 --enable-collpane       use wxCollapsiblePane class
 --enable-colourpicker   use wxColourPickerCtrl class
 --enable-combobox       use wxComboBox class
 --enable-comboctrl      use wxComboCtrl class
 --enable-datepick       use wxDatePickerCtrl class
 --enable-dirpicker      use wxDirPickerCtrl class
 --enable-display        use wxDisplay class
 --enable-detect_sm      use code to detect X11 session manager
 --enable-filepicker     use wxFilePickerCtrl class
 --enable-fontpicker     use wxFontPickerCtrl class
 --enable-gauge          use wxGauge class
 --enable-grid           use wxGrid class
 --enable-dataviewctrl   use wxDataViewCtrl class
 --enable-hyperlink      use wxHyperlinkCtrl class
 --enable-imaglist       use wxImageList class
 --enable-listbook       use wxListbook class
 --enable-listbox        use wxListBox class
 --enable-listctrl       use wxListCtrl class
 --enable-notebook       use wxNotebook class
 --enable-odcombobox     use wxOwnerDrawnComboBox class
 --enable-radiobox       use wxRadioBox class
 --enable-radiobtn       use wxRadioButton class
 --enable-sash           use wxSashWindow class
 --enable-scrollbar      use wxScrollBar class and scrollable windows
 --enable-searchctrl     use wxSearchCtrl class
 --enable-slider         use wxSlider class
 --enable-spinbtn        use wxSpinButton class
 --enable-spinctrl       use wxSpinCtrl class
 --enable-splitter       use wxSplitterWindow class
 --enable-statbmp        use wxStaticBitmap class
 --enable-statbox        use wxStaticBox class
 --enable-statline       use wxStaticLine class
 --enable-stattext       use wxStaticText class
 --enable-statusbar      use wxStatusBar class
 --enable-tabdialog      use wxTabControl class
 --enable-textctrl       use wxTextCtrl class
 --enable-togglebtn      use wxToggleButton class
 --enable-toolbar        use wxToolBar class
 --enable-tbarnative     use native wxToolBar class
 --enable-treebook       use wxTreebook class
 --enable-toolbook       use wxToolbook class
 --enable-treectrl       use wxTreeCtrl class
 --enable-tipwindow      use wxTipWindow class
 --enable-popupwin       use wxPopUpWindow class
 --enable-commondlg      use all common dialogs
 --enable-aboutdlg       use wxAboutBox
 --enable-choicedlg      use wxChoiceDialog
 --enable-coldlg         use wxColourDialog
 --enable-filedlg        use wxFileDialog
 --enable-finddlg        use wxFindReplaceDialog
 --enable-fontdlg        use wxFontDialog
 --enable-dirdlg         use wxDirDialog
 --enable-msgdlg         use wxMessageDialog
 --enable-numberdlg      use wxNumberEntryDialog
 --enable-splash         use wxSplashScreen
 --enable-textdlg        use wxTextDialog
 --enable-tipdlg         use startup tips
 --enable-progressdlg    use wxProgressDialog
 --enable-wizarddlg      use wxWizard
 --enable-menus          use wxMenu/wxMenuBar/wxMenuItem classes
 --enable-miniframe      use wxMiniFrame class
 --enable-tooltips       use wxToolTip class
 --enable-splines        use spline drawing code
 --enable-mousewheel     use mousewheel
 --enable-validators     use wxValidator and derived classes
 --enable-busyinfo       use wxBusyInfo
 --enable-joystick       use wxJoystick
 --enable-metafiles      use wxMetaFile (Win32 only)
 --enable-dragimage      use wxDragImage
 --enable-accessibility  enable accessibility support
 --enable-dccache        cache temporary wxDC objects (Win32 only)
 --enable-palette        use wxPalette class
 --enable-image          use wxImage class
 --enable-gif            use gif images (GIF file format)
 --enable-pcx            use pcx images (PCX file format)
 --enable-tga            use tga images (TGA file format)
 --enable-iff            use iff images (IFF file format)
 --enable-pnm            use pnm images (PNM file format)
 --enable-xpm            use xpm images (XPM file format)
 --enable-icocur         use Windows ICO and CUR formats
 --enable-official_build official build of wxWidgets (win32 DLL only)
 --enable-vendor=VENDOR  vendor name (win32 DLL only)
 --disable-largefile     omit support for large files
 --disable-gtktest       do not try to compile and run a test GTK+ program
 --disable-gtktest       Do not try to compile and run a test GTK program
 --disable-sdltest       Do not try to compile and run a test SDL program
 --enable-omf            use OMF object format (OS/2)
 --disable-dependency-tracking         don't use dependency tracking even if the compiler can
 --disable-precomp-headers             don't use precompiled headers even if compiler can

Optional Packages:

 --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
 --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
 --without-subdirs       don't generate makefiles for samples/demos/...
 --with-gtk[=VERSION]    use GTK+, VERSION can be 2 (default), 1 or "any"
 --with-motif            use Motif/Lesstif
 --with-mac              use Mac OS X
 --with-cocoa            use Cocoa
 --with-wine             use Wine
 --with-msw              use MS-Windows
 --with-pm               use OS/2 Presentation Manager
 --with-mgl              use SciTech MGL
 --with-directfb         use DirectFB
 --with-microwin         use MicroWindows
 --with-x11              use X11
 --with-libpng           use libpng (PNG image format)
 --with-libjpeg          use libjpeg (JPEG file format)
 --with-libtiff          use libtiff (TIFF file format)
 --with-libxpm           use libxpm (XPM file format)
 --with-libmspack        use libmspack (CHM help files loading)
 --with-sdl              use SDL for audio on Unix
 --with-gnomeprint       use GNOME print for printing under GNOME
 --with-gnomevfs         use GNOME VFS for associating MIME types
 --with-hildon           use Hildon framework for Nokia 770
 --with-opengl           use OpenGL (or Mesa)
 --with-themes=all|list  use only the specified comma-separated list of wxUniversal themes
 --with-dmalloc          use dmalloc library (http://dmalloc.com/)
 --with-regex            enable support for wxRegEx class
 --with-zlib             use zlib for LZW compression
 --with-odbc             use the IODBC and wxODBC classes
 --with-expat            enable XML support using expat parser
 --with-macosx-sdk=PATH          use an OS X SDK at PATH
 --with-macosx-version-min=VER   build binaries which require at least this OS X version
 --with-flavour=NAME             specify a name to identify this build
 --with-gtk-prefix=PFX           Prefix where GTK is installed (optional)
 --with-gtk-exec-prefix=PFX      Exec prefix where GTK is installed (optional)
 --with-x                        use the X Window System
 --with-libiconv-prefix=DIR      search for libiconv in DIR/include and DIR/lib
 --with-sdl-prefix=PFX           Prefix where SDL is installed (optional)
 --with-sdl-exec-prefix=PFX      Exec prefix where SDL is installed (optional)
 --with-cppunit-prefix=PFX       Prefix where CppUnit is installed (optional)
 --with-cppunit-exec-prefix=PFX  Exec prefix where CppUnit is installed (optional)

Some influential environment variables:

 CC          C compiler command
 CFLAGS      C compiler flags
 LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
             nonstandard directory <lib dir>
 CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
             headers in a nonstandard directory <include dir>
 CPP         C preprocessor
 CXX         C++ compiler command
 CXXFLAGS    C++ compiler flags
 PKG_CONFIG  path to pkg-config utility
 DIRECTFB_CFLAGS            C compiler flags for DIRECTFB, overriding pkg-config
 DIRECTFB_LIBS              linker flags for DIRECTFB, overriding pkg-config
 PANGOX_CFLAGS              C compiler flags for PANGOX, overriding pkg-config
 PANGOX_LIBS                linker flags for PANGOX, overriding pkg-config
 PANGOFT2_CFLAGS            C compiler flags for PANGOFT2, overriding pkg-config
 PANGOFT2_LIBS              linker flags for PANGOFT2, overriding pkg-config
 PANGOXFT_CFLAGS            C compiler flags for PANGOXFT, overriding pkg-config
 PANGOXFT_LIBS              linker flags for PANGOXFT, overriding pkg-config
 LIBGNOMEPRINTUI_CFLAGS     C compiler flags for LIBGNOMEPRINTUI, overriding pkg-config
 LIBGNOMEPRINTUI_LIBS       linker flags for LIBGNOMEPRINTUI, overriding pkg-config
 GNOMEVFS_CFLAGS            C compiler flags for GNOMEVFS, overriding pkg-config
 GNOMEVFS_LIBS              linker flags for GNOMEVFS, overriding pkg-config
 HILDON_CFLAGS              C compiler flags for HILDON, overriding pkg-config
 HILDON_LIBS                linker flags for HILDON, overriding pkg-config
 CAIRO_CFLAGS               C compiler flags for CAIRO, overriding pkg-config
 CAIRO_LIBS                 linker flags for CAIRO, overriding pkg-config
 GST_CFLAGS                 C compiler flags for GST, overriding pkg-config
 GST_LIBS                   linker flags for GST, overriding pkg-config

Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations.

Report bugs to <wx-dev@lists.wxwidgets.org>.