Skip to main content

How to use wxWidgets on Windows with a Makefile

 Hello!

I wanted to learn GUI rpogramming in C++. One of the main libraries for this purpose is called wxWidgets. It's very popular and seem powerful enough to make even a complex graphical interface. I also liked the fact that it's multi platforms.

I am on Windows, using MingW and I like coding with VS Code. I also like having a clear Makefile to generate my programs. So here is how I have managed to compile the Hello World program you can find on the wxWidgets website.

First, go to their github repository and clone it in a folder you will keep on your computer.

In the root directory, run the command git submodule update --init. If the clone operation has not done so already, this command will pull additional repositories needed by wxWidget.

Go to build\msw.

Run the command: mingw32-make -f makefile.gcc -j4 SHARED=1 UNICODE=1 BUILD=debug clean.

It will delete any unwanted file.

Once it's done, re run the command but without the clean instruction. This will build the library from the source. This way you can control exactly which version you want.

During the build process, I got some errors regarding c:\mingw\lib\bfd-plugins\libdep.a. As far as I understood the bug reports on this error, it will not affect the resulting build. In my case, it did not prevent the Hello World program from running. I am not sure if more advanced features will be an issue because of it. Anyway, in the context of this article, just click the ok button to dismiss the error.

It will take a little while. Like, around 15 minutes.

Once it's done, you should find inside of the git repository:

An include folder, which contains the header files.

A lib folder, which contains the library files and the dll.

Alright, now, we have all we need, and it's just a matter of linking the correct folders in the Makefile. 

For the includes, you will need: 

  • -IC:\path_to_git_repo\include
  • -IC:\path_to_git_repo\lib\gcc_dll\mswud (this one is because there is a setup.h inside)

For the linkers, you will need:

  • -LC:\path_to_git_repo\lib\gcc_dll
  • -lwxmsw31ud_core -lwxbase31ud

Copy the corresponding dlls in the folder where your Makefile will generate your executable. The dlls names are: 

  • wxbase316ud_gcc_custom 
  • wxmsw316ud_core_gcc_custom

And that's it! You can now compile your program like you would normally.

Now, notice the BUILD=debug argument when we built from the source? Before sharing your GUI application with the whole world, you want to use the release version of wxWidget. To do so, you have to rebuild it by replacing BUILD=debug by BUILD=release. Once it is done, you have to include/link the same file names but without the letter d at the end (so, mswu instead of mswud,  -lwxmsw31u_core instead of -lwxmsw31ud_core, etc.). The build time is even longer for the release version.

I hope it was helpful,

Have fun!

 

Comments

Popular posts from this blog

How to generate a self-signed certificate with Openssl (using git windows bash)

I recently needed to generate a self-signed certificate to test a website locally. I wasn't familiar with the process, and I wanted to share here what I learned. First, we need a private key. A private key is a long series of characters that must be kept secret. In my context, it will be used to encrypt messages before the client and the server, in a way secure enough to prevent anybody to spy on them. Once the private key is created, we need to generate another file that will be the "signature" of our certificate. Among other data, this file will contains some information specific to the server's context: country, organization's name, email address of the organization's technical contact, etc. Once this signature is established, there are two paths: - Path A: If we want our server to be publicly accessible, every browser in the world must able to trust the certificate. In order for that to happen, we need to send our signature file to one of the official SSL ...

How to Compile a GTK4 program on Windows (using MSYS)

  I wanted to create a GUI program using C and GTK. I am using a windows operating system, so I had followed the instructions from the GTK Windows installation page . However, when trying to compile my program using: gcc main.c -o main.exe `pkg-config --cflags --libs gtk4` I had the following errors: gcc.exe: error: pkg-config: No such file or directory gcc.exe: error: gtk4`: No such file or directory gcc.exe: error: unrecognized command-line option '--cflags' gcc.exe: error: unrecognized command-line option '--libs' I noticed that the command  pkg-config --cflags --libs gtk4 was actually returning a list of required includes. It seemed that the gcc command simply was not able to recognize them. To solve the problem, I then created a Makefile, in which a variable called GTK_4_INCLUDES contains the list of includes.  The compilation command becomes:   gcc main.c -o main.exe $(GTK_4_INCLUDES) To compile the program in the console, I just had to type mingw32-make , a...

Connecting to MongoDB from WSL2

My application runs a web server connected to a MongoDB database. For all my development needs, I am using WSL on windows 10. Unfortunately, MongoDB is not available on WSL, so I have installed the Windows version and pointed my server to the localhost:27017 address, no issue. It worked well until the day I switched to WSL2. Then I would get some ECONNREFUSED errors. To solve this problem, I have found a simple three steps solution.  The whole idea is that WSL2 now uses a true VM and got its own network interface (IP, MAC address, etc.). I think it's a bit more complicated than that, but that's how I understand it. Long story short, you now have a windows IP, and a WSL IP. 1. Accessing  the windows host from WSL The first step is to make sure that you can ping the windows IP from WSL. It was not working for me right away. It seems like there are still inconsistencies in the WSL implementation, but this github issue thread gave a good solution. It's a script yo have to run...