importing wx ends in: undefined symbol: _ZTI21wxTaskBarIconAreaBase

Hello,

after some hazzles I was able to successfully configure, compile and
install wxPython 2.5.2.8 for GTK+ 2 on an RedHat 8.0 system
(with all recent updates). For a successful build I had to patch
/usr/include/gtk-2.0/gdk/gdkwindow.h :

--- gtk-2.0/gdk/gdkwindow.h.orig 2004-09-17 17:04:13.000000000 +0200
+++ gtk-2.0/gdk/gdkwindow.h 2004-09-18 19:44:53.000000000 +0200
@@ -104,7 +104,11 @@
   GDK_WINDOW_TYPE_HINT_NORMAL,
   GDK_WINDOW_TYPE_HINT_DIALOG,
   GDK_WINDOW_TYPE_HINT_MENU,
- GDK_WINDOW_TYPE_HINT_TOOLBAR
+ GDK_WINDOW_TYPE_HINT_TOOLBAR,
+ GDK_WINDOW_TYPE_HINT_SPLASHSCREEN,
+ GDK_WINDOW_TYPE_HINT_UTILITY,
+ GDK_WINDOW_TYPE_HINT_DOCK,
+ GDK_WINDOW_TYPE_HINT_DESKTOP
} GdkWindowTypeHint;

(RedHat 8.0 still comes with GTK 2.0.6 and this patch prevents from
having to disable everything in configure that has to do with splash
screens.)

Afterwards, I followed the instructions at
http://wxpython.sourceforge.net/BUILD.html

These are my configure options:

../configure --prefix=/usr/local/kmrc/wx \
                        --with-gtk \
                        --enable-unicode \
                        --without-opengl \
                        --disable-soname \
                        --enable-monolithic \
                        --enable-optimise \
                        --enable-debug_flags \
                        --enable-geometry \
                        --enable-sound --with-sdl \
                        --with-libpng=builtin \
                        --with-libjpeg=builtin \
                        --with-libtiff=builtin \
                        --with-zlib=builtin

After .make && .make install, the setup in the
wxPython directory went as follows:

python2.3 setup.py \
    WX_CONFIG=/usr/local/kmrc/wx/bin/wx-config \
    WXPORT="gtk2" UNICODE=1 \
    BUILD_GLCANVAS=0 \
    build

and the installation

python2.3 setup.py \
    WX_CONFIG=/usr/local/kmrc/wx/bin/wx-config \
    WXPORT="gtk2" UNICODE=1 \
    BUILD_GLCANVAS=0 \
    install --prefix=/usr/local/kmrc/wx

All goes well (except for some warnings about probably uninitialized
booleans created1 and created2 while building the python stuff - but
I've seen that before in 2.5.2.7).

And now there's my problem:
    
[tkurbad@asteria 2004-09-16]$ LD_LIBRARY_PATH="/usr/local/kmrc/wx/lib/" \
    PYTHONPATH="/usr/local/kmrc/wx/lib/python2.3/site-packages" \
    /usr/local/kmrc/python/bin/python

Python 2.3.4 (#2, Sep 16 2004, 02:27:37)
[GCC 3.2 20020903 (Red Hat Linux 8.0 3.2-7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

from wx import *

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/local/kmrc/wx/lib/python2.3/site-packages/wx/__init__.py", line 42, in ?
    from wx._core import *
  File "/usr/local/kmrc/wx/lib/python2.3/site-packages/wx/_core.py", line 4, in ?
    import _core_
ImportError: /usr/local/kmrc/wx/lib/libwx_gtk2u-2.5.so.2: undefined symbol: _ZTI21wxTaskBarIconAreaBase

Of course, the same happens, if I try to run the demos.
Also, the error appears with --disable-monolithic in configure. Then the
message comes from libwx_gtk2u_adv-2.5.so.2

I tracked down the location of the symbol and found the piece of code
in src/unix/taskbarx11.cpp

#ifdef __WXGTK20__
    #include "wx/gtk/taskbarpriv.h"
#else
    class WXDLLIMPEXP_ADV wxTaskBarIconAreaBase : public wxFrame
    {
    public:
        wxTaskBarIconAreaBase()
            : wxFrame(NULL, wxID_ANY, _T("systray icon"),
                      wxDefaultPosition, wxDefaultSize,
                      wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR |
                      wxSIMPLE_BORDER | wxFRAME_SHAPED) {}

        bool IsProtocolSupported() const { return false; }
    };
#endif

but my knowledge of C++ leaves me there while trying to change
something...

Does anyone have the slightest clue of what is happening here?

Thanks in advance,
Torsten

Torsten Kurbad wrote:

Hello,

after some hazzles I was able to successfully configure, compile and
install wxPython 2.5.2.8 for GTK+ 2 on an RedHat 8.0 system
(with all recent updates). For a successful build I had to patch
/usr/include/gtk-2.0/gdk/gdkwindow.h :

--- gtk-2.0/gdk/gdkwindow.h.orig 2004-09-17 17:04:13.000000000 +0200
+++ gtk-2.0/gdk/gdkwindow.h 2004-09-18 19:44:53.000000000 +0200
@@ -104,7 +104,11 @@
   GDK_WINDOW_TYPE_HINT_NORMAL,
   GDK_WINDOW_TYPE_HINT_DIALOG,
   GDK_WINDOW_TYPE_HINT_MENU,
- GDK_WINDOW_TYPE_HINT_TOOLBAR
+ GDK_WINDOW_TYPE_HINT_TOOLBAR,
+ GDK_WINDOW_TYPE_HINT_SPLASHSCREEN,
+ GDK_WINDOW_TYPE_HINT_UTILITY,
+ GDK_WINDOW_TYPE_HINT_DOCK,
+ GDK_WINDOW_TYPE_HINT_DESKTOP
} GdkWindowTypeHint;

(RedHat 8.0 still comes with GTK 2.0.6 and this patch prevents from
having to disable everything in configure that has to do with splash
screens.)

Some changes were recently checked in to CVS to allow wxGTK to build the splashscreen with GTK 2.0.

[...]

    import _core_
ImportError: /usr/local/kmrc/wx/lib/libwx_gtk2u-2.5.so.2: undefined symbol: _ZTI21wxTaskBarIconAreaBase

I tracked down the location of the symbol and found the piece of code
in src/unix/taskbarx11.cpp

#ifdef __WXGTK20__
    #include "wx/gtk/taskbarpriv.h"
#else
    class WXDLLIMPEXP_ADV wxTaskBarIconAreaBase : public wxFrame
    {
    public:
        wxTaskBarIconAreaBase()
            : wxFrame(NULL, wxID_ANY, _T("systray icon"),
                      wxDefaultPosition, wxDefaultSize,
                      wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR |
                      wxSIMPLE_BORDER | wxFRAME_SHAPED) {}

        bool IsProtocolSupported() const { return false; }
    };
#endif

but my knowledge of C++ leaves me there while trying to change
something...

Since you are building for GTK2 then it is actually going to include the class def from wx/gtk/taskbarpriv.h, and the implementation for that version of it is in src/gtk/taskbar.cpp, but it is guarded by #if GTK_CHECK_VERSION(2, 1, 0) so the code is not actually compiled. You might try changing the "1" with a "0" to see if maybe it doesn't require GTK 2.1 after all. Otherwise for a workaround you could probably take out the #ifdef clause in the code above so it always uses the version of the class in src/unix/taskbarx11.cpp. In either case please enter a bug report about this.

[ Ah, I see from your other message that you've already found the workaround. ]

···

--
Robin Dunn
Software Craftsman
http://wxPython.org Java give you jitters? Relax with wxPython!