Author Topic: How to build wxwidgets-2.6.3 to work with code::blocks  (Read 17701 times)

Offline thomas

  • Administrator
  • Lives here!
  • *****
  • Posts: 3979
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #15 on: July 06, 2006, 12:02:18 am »
Here comes the wxWidgets hater. :)
Ok, everybody who has read more than 3 threads on this forum knows my opinion on wxWidgets, but seriously: here is a little of my experience. :)

One important thing with wxWidgets is that you have to build it monolithic (either static or shared, doesn't matter), or your life will be a very unhappy one.
In fact, a monolithic shared build works very nicely out of the box if you can live with distributing a huge dll. If only this dll wasn't so massively fat.

Don't tune any of the configuration options that are readily available because wxWidgets is not really meant to be tuned.
For example, many options that say "can safely be turned off if you don't need it" cause either your wxWidgets build to fail after running 75% OK, or they cause missing symbols when you try to link your program (no error earlier).

Similar strange things happen with non-monolithic builds. In theory, you should be able to leave out a few libraries if you don't use most features, but in practice, it only works if you include almost all or all of them, even for the most basic applications.
Also, I had it happen that the same program linked with a non-monolithic build crashed, but it would work fine with a monolithic build (identical options, except for this one flag).

wxWidgets requires you to link to a ton of other libraries. If you get a thousand errors when building your programs, you should try adding libkernel32.a, libuser32.a, libgdi32.a, libcomdlg32.a, libuuid.a, libole32.a,  liboleaut32.a, libvomctl32.a, libshell32.a, libadvapi32.a.
If you still get missing symbols after that, you may have to add libwinmm.a, libwisock32.a and libwinspool.a too. Unluckily, the project wizard doesn't do that for you.

Last week, I wanted to make a simple statically linked application that did nothing but display a tray icon and two really simple dialogs. Since I did not know the Windows API for displaying tray icons, I made the massive mistake to give wxWidgets a try (as there is a ready-made tray icon class). Bad mistake!
After recompiling wxWidgets in several configurations several times and fighting for four hours to finally get a working 2 MB stripped executable, I decided to use raw Win32 API instead. It took little over one hour including reading the MSDN documentation, and the executable is 17 kB, including icons...

Regarding the project wizard, when I last used it a week ago, it made me cry because it was setting up everything incorrectly (did not specify the correct include and linker paths, and did not configure properly for static linkage either).
However, as Yiannis said above, the wizard has seen an overhaul, so that problem should be solved now. You still may have to add a few libraries by hand, but it should work rather painlessly now.
"We should forget about small efficiencies, say about 97% of the time: Premature quotation is the root of public humiliation."

Offline wittend

  • Multiple posting newcomer
  • *
  • Posts: 18
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #16 on: July 06, 2006, 01:28:45 am »
Quote
I have given a try to the wxWidgets template (Windows XP SP2, rev2689 built with GCC 3.4.5, wxWidgets 2.6.3 Patch 2 built with GCC 4.0.3, GCC 3.4.5) and it works fine. It builds without errors and warning and runs fine.

May be the problems you have are not with C::B or the template, but e.g., with your wxWidgets or others.

Patch 2 for wxWidgets 2.6.3 can be found here.

I rebuilt wxWidgets and upgraded the IDE before running this build.  The only thing that I have not yet done is create another app de novo.

-- Dave

Offline wittend

  • Multiple posting newcomer
  • *
  • Posts: 18
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #17 on: July 06, 2006, 01:46:31 am »
Could you check if you have in the list of defines for your project WXUSINGDLL?

If it's not there add it and rebuild your project.

That helped.  I remember explicitly removing WXUSINGDLL because elswhere I had attempted to specify a static build.   

After making this change, the output I recieve is this:

-------------- Build: default in test ---------------
mingw32-g++.exe -pipe -mthreads -Winvalid-pch -include "wx_pch.h" -D__GNUWIN32__ -D__WXMSW__ -DUSE_PCH -D__GNUWIN32__ -D__WXMSW__ -DUSE_PCH -DHAVE_W32API_H -DwxUSE_UNICODE -DwxUSE_THREADS -DWXUSINGDLL  -ID:\bin\wxWidgets-2.6.3\include -ID:\bin\wxWidgets-2.6.3\lib\gcc_dll\msw -ID:\bin\wxWidgets-2.6.3\contrib\include -ID:\bin\CodeBlocks\include -ID:\bin\wxWidgets-2.6.3\include -ID:\bin\wxWidgets-2.6.3\include\wx -ID:\bin\wxWidgets-2.6.3\lib\gcc_dll\mswu  -c wx_pch.h -o wx_pch.h.gch\default_wx_pch.h.gch
mingw32-g++.exe -pipe -mthreads -Winvalid-pch -include "wx_pch.h" -D__GNUWIN32__ -D__WXMSW__ -DUSE_PCH -D__GNUWIN32__ -D__WXMSW__ -DUSE_PCH -DHAVE_W32API_H -DwxUSE_UNICODE -DwxUSE_THREADS -DWXUSINGDLL  -ID:\bin\wxWidgets-2.6.3\include -ID:\bin\wxWidgets-2.6.3\lib\gcc_dll\msw -ID:\bin\wxWidgets-2.6.3\contrib\include -ID:\bin\CodeBlocks\include -ID:\bin\wxWidgets-2.6.3\include -ID:\bin\wxWidgets-2.6.3\include\wx -ID:\bin\wxWidgets-2.6.3\lib\gcc_dll\mswu  -c main.cpp -o .objs\main.o
mingw32-g++.exe -LD:\bin\wxWidgets-2.6.3\lib\gcc_dll -LD:\bin\wxWidgets-2.6.3\lib -LD:\bin\CodeBlocks\lib -LD:\bin\wxWidgets-2.6.3\lib  -o TEST.exe .objs\main.o    D:\bin\wxWidgets-2.6.3\lib\libwx_mswu-2.6.dll.a  -mwindows
.objs\main.o:main.cpp:(.rdata$_ZTV7MyFrame[vtable for MyFrame]+0x138): undefined reference to `wxWindow::RegisterHotKey(int, int, int)'
.objs\main.o:main.cpp:(.rdata$_ZTV7MyFrame[vtable for MyFrame]+0x13c): undefined reference to `wxWindow::UnregisterHotKey(int)'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 8 seconds)
0 errors, 0 warnings

I believe that I may be down to only the Hotkey errors.  I quess that those calls relate to the the default menu items in the minimal application.  If only I knew how to get rid of them.

-- Dave

Offline wittend

  • Multiple posting newcomer
  • *
  • Posts: 18
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #18 on: July 06, 2006, 01:54:11 am »
Aha! I built a new minimalist app with the new Wizard, and it worked! 

Thanks to everyone who read my posts and offered their suggestions!

-- Dave

Offline Michael

  • Lives here!
  • ****
  • Posts: 1608
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #19 on: July 06, 2006, 11:56:39 pm »
Here comes the wxWidgets hater. :)
Ok, everybody who has read more than 3 threads on this forum knows my opinion on wxWidgets, but seriously: here is a little of my experience. :)

Hello,

Thank you very much for this very interesting post :).

Best wishes,
Michael

Offline troels

  • Multiple posting newcomer
  • *
  • Posts: 71
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #20 on: July 07, 2006, 10:44:55 am »
I wanted to make a simple statically linked application that did nothing but display a tray icon and two really simple dialogs. Since I did not know the Windows API for displaying tray icons, I made the massive mistake to give wxWidgets a try (as there is a ready-made tray icon class). Bad mistake!

:shock:
wxTaskBarIcon works fine for me. I don't remember having any initial problems, it did what I expected it to do.
/wx/samples/taskbar/vc_msw/taskbar.exe is 860 KB on my system:
MSVC6, wx 2.6.3.2 optimized for size using *statically* linked C runtime
The MS linkers excels at tossing out unused code.

Offline thomas

  • Administrator
  • Lives here!
  • *****
  • Posts: 3979
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #21 on: July 07, 2006, 01:41:49 pm »
Quote
wxTaskBarIcon works fine for me. I don't remember having any initial problems, it did what I expected it to do.
/wx/samples/taskbar/vc_msw/taskbar.exe is 860 KB on my system
I did not say it does not work in general. It does work, in fact it works inside Code::Blocks, too (batch builds).

It is a well-known fact that gcc bloats wxWidgets executables even more than MSVC (2 MB executable in my case), but that's not the point. My point is that you can try for many hours to get down to a reasonable size, and it is just hopeless. Similar figures apply to the memory footprint.

You will certainly agree that >800 kB is outright ridiculous ( >2 MB even more so) for an application that shows an icon and two simple dialogs and does not do an awful lot of magic. I would not mind if it was 50 or 60 kB, maybe even 80, but certainly not 800.

It should really be possible to get something of a reasonable size by statically linking only what you really need and by disabling features that you definitely never use, but in my experience, all you get is a broken build.
"We should forget about small efficiencies, say about 97% of the time: Premature quotation is the root of public humiliation."

Offline troels

  • Multiple posting newcomer
  • *
  • Posts: 71
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #22 on: July 07, 2006, 04:06:38 pm »
You will certainly agree that >800 kB is outright ridiculous

Absolutely not, I disagree.
860 KB seems like an ok price to pay for having a x-platform gui framework to hold your hand.
(Unless you happen to hate the framework)
This is bloat:
email clients
« Last Edit: January 23, 2007, 01:40:27 pm by troels »

Offline thomas

  • Administrator
  • Lives here!
  • *****
  • Posts: 3979
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #23 on: July 07, 2006, 05:51:09 pm »
Quote
This is bloat: http://img90.imageshack.us/my.php?image=bloat4fj.png
Quote
860 KB seems like an ok price to pay for having a x-platform gui framework to hold your hand.
It is an OK price if you write a program that's 10-15 MB in size anyway (for example Thunderbird, which you call "bloated"). However, it should be possible to get away with a few dozen kilobytes otherwise. Also, it is not only about file size, but about memory, too.

The "Hello World" application that you can build using the wx template has a virtual size of 39760 kB and a working set of 5876 kB. Just like the file size, this memory footprint is absolutely ridiculous for a program that does nothing but show a naked window and an about box.

If you are sitting on your development machine with 2 GB of physical RAM, then you can relax, lean back and say "yeah, yeah, shut up, so what".

However, if your tool is to be used by a few hundred people who are to have it running 8 hours every day on typical backoffice machines that have 256 MB (maybe 512 MB if you're lucky) and on which they have to use Outlook, Word, Excel, and Lotus Notes at the same time (and a couple of smaller apps), then a puny few megabytes of RAM that are gone for no obvious reason do matter a lot.
The same goes for loading an unnecessarily big program off the network share in the morning.
"We should forget about small efficiencies, say about 97% of the time: Premature quotation is the root of public humiliation."

Offline BordRider

  • Multiple posting newcomer
  • *
  • Posts: 12
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #24 on: July 07, 2006, 06:00:40 pm »
In troel's defense, I think he meant that Outlook is bloated, it's more than 20 times the size of Thunderbird and they are meant for the same purpose (although Outlook does have more features, it farms some tasks out to other office programs, like Word for email editing, which is definitely bloat).

But you're right, and this is off topic, so I'll stop.

Offline troels

  • Multiple posting newcomer
  • *
  • Posts: 71
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #25 on: July 07, 2006, 06:25:48 pm »
In troel's defense, I think he meant that Outlook is bloated, it's more than 20 times the size of Thunderbird

Certainly. Thunderbird is cool (small footprint).
The calendar functionality of Outlook comes at the price of 300 extra megabytes :)

Offline troels

  • Multiple posting newcomer
  • *
  • Posts: 71
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #26 on: January 23, 2007, 01:43:00 pm »
Speaking of code bloat, CB is really giving it to Eclipse, here:

EasyEclipse for C and C++ vs Code::Blocks

EasyEclipse: not easy on memory!

 :D

Edit: Where did my avatar go?
Did it get censored?  :?
« Last Edit: January 23, 2007, 02:17:08 pm by troels »

Offline mandrav

  • Project Leader
  • Administrator
  • Lives here!
  • *****
  • Posts: 4291
    • Code::Blocks IDE
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #27 on: January 23, 2007, 02:24:54 pm »
Edit: Where did my avatar go?
Did it get censored?  :?

Uhm, no. This morning the attachments folder was cleaned up from old content. In your case, old content meant "avatars of members not visited the last 45 days". Sorry for the confusion. I guess it would be easy for you to re-upload it? :)
Be patient!
This bug will be fixed soon...

Offline troels

  • Multiple posting newcomer
  • *
  • Posts: 71
Re: How to build wxwidgets-2.6.3 to work with code::blocks
« Reply #28 on: January 23, 2007, 02:29:06 pm »
I guess it would be easy for you to re-upload it? :)
Absolutely. Just checking the waters :)
/Troels