undefined reference to `__imp_CreateSolidBrush'

Viewed 44

Trying to use CreateSolidBrush to change a window background color. I've included wingdi.h, I believe I've linked gdi32.lib ( however I converted gdi32.lib to a gdi32.a by using LIB2A, and I wonder if this may be an issue? ).

I wouldn't mind using another function but I worry this could be come a re-occuring issue if I'm not able to find a solution.

Some relevant code:

#include <stdio.h> 
#include <windows.h>
#include <wingdi.h>

#include <main.h>

DWORD CreateMainWindow(void)
{
    .............

    WNDCLASSEXA WindowClass = { 0 };

    WindowClass.hbrBackground = CreateSolidBrush(RGB(200, 200, 200));

    .............
}

I use a function to easily compile

int Compile()
{
        ................

        int result = 0;

        char *include = "C:\\Users\\Coding\\C\\src\\include";
        char *link = "C:\\Users\\Coding\\C\\src\\lib";
        char command[256];
        
        if(snprintf(
            command,
            sizeof(command), 
            "gcc -o main -I%s  -l gdi32 -L%s main.c", include, link) >= sizeof(command))
        {
            //exception catching and handling
        }               
        else
        {
            system(command);
        }

        return result;
}

I have no reason to believe the file isn't being linked as I'm not receiving an error.

Also I'm only using Notepad++, mingw64, and command prompt.

2 Answers

The error is a linker error, because it can't find the shared library symbol CreateSolidBrush.

All that is needed is linker flag -lgdi32, so it links with MinGW's libgdi32.a.

Don't try to generate this file by converting it from some other file you found which is probably built with a totally different compiler. If you already experimented with that make sure to clean up any lingering gdi32 .a or .lib files from your previous attempts.

Well the answer was extremely simple, linkages and includes must come after the file.


C:\User> gcc main.c -lgdi32 -I<include path> -o main

If this was obvious then I apologize, hopefully this helps another confused individual

Related