MinGW GLFW undefined reference (да, опять)

Здравствуйте.
В очередной бесчисленный раз захотелось допилить один из старых проектов. И в очередной раз MinGW сошел с ума.
Есть код:

void glfw_Keyboard_callback_func(GLFWwindow* window, int key, int scancode, int action, int mods)
{
	if (action == GLFW_PRESS)
    {
        switch (key)
        {
                case GLFW_KEY_ESCAPE:
                case GLFW_KEY_ENTER:
                case GLFW_KEY_KP_ENTER:
                    std::cout << "Window will be closed soon..." << std::endl;
                    //glfwSetWindowShouldClose(window, GLFW_TRUE); //<<<<<<<
                    break;
        }
	}
}

С закомментированной строчкой компилируется. А если её раскомментировать, то начинает сходить с ума

||=== Build: Debug in OpenGL_GLFW_CodeBlocks (compiler: GNU GCC Compiler) ===|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(window.c.obj):window.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(window.c.obj):window.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `CreateDIBSection@24'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `CreateBitmap@20'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `DeleteObject@4'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `DeleteObject@4'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `DeleteObject@4'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `CreateRectRgn@16'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `DeleteObject@4'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_window.c.obj):win32_window.c|| more undefined references to `__mingw_free' follow|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(wgl_context.c.obj):wgl_context.c|| undefined reference to `SwapBuffers@4'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(wgl_context.c.obj):wgl_context.c|| undefined reference to `ChoosePixelFormat@8'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(wgl_context.c.obj):wgl_context.c|| undefined reference to `SetPixelFormat@12'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(wgl_context.c.obj):wgl_context.c|| undefined reference to `DescribePixelFormat@16'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(wgl_context.c.obj):wgl_context.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(wgl_context.c.obj):wgl_context.c|| undefined reference to `DescribePixelFormat@16'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(wgl_context.c.obj):wgl_context.c|| undefined reference to `SetPixelFormat@12'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(wgl_context.c.obj):wgl_context.c|| undefined reference to `DescribePixelFormat@16'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(wgl_context.c.obj):wgl_context.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(wgl_context.c.obj):wgl_context.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(egl_context.c.obj):egl_context.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(egl_context.c.obj):egl_context.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(egl_context.c.obj):egl_context.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(egl_context.c.obj):egl_context.c|| more undefined references to `__mingw_free' follow|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(input.c.obj):input.c|| undefined reference to `__mingw_realloc'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(input.c.obj):input.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| more undefined references to `__mingw_free' follow|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| undefined reference to `__mingw_realloc'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(monitor.c.obj):monitor.c|| more undefined references to `__mingw_free' follow|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_monitor.c.obj):win32_monitor.c|| undefined reference to `CreateDCW@16'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_monitor.c.obj):win32_monitor.c|| undefined reference to `GetDeviceCaps@8'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_monitor.c.obj):win32_monitor.c|| undefined reference to `GetDeviceCaps@8'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_monitor.c.obj):win32_monitor.c|| undefined reference to `DeleteDC@4'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_monitor.c.obj):win32_monitor.c|| undefined reference to `__mingw_free'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_monitor.c.obj):win32_monitor.c|| undefined reference to `GetDeviceCaps@8'|
c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libglfw3.a(win32_monitor.c.obj):win32_monitor.c|| undefined reference to `GetDeviceCaps@8'|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build failed: 50 error(s), 4 warning(s) (0 minute(s), 1 second(s)) ===|

-lgdi32 подключен
Такое ощущение, что либа не та :thinking: Но что у них на сайте было, то и скачал :man_shrugging:

Поставил старую версию GLFW, но ошибка та же самая.
Могу сделать скромный вывод, что это опять винда втупила и надо просто перезагрузиться. Но я сейчас не могу перезагрузиться.

Если в проекте или команде компиляции не указан полный путь до библиотек, то PATH мог не обновиться, надо как минимум перезапустить то, из чего оно запускается.

Там нет инсталлера. А значит, PATH и не должен был поменяться. PATH до нужных директорий прописан вручную. Я просто вытащил из архива GLFW нужные файлы.
Но ведь я ничего не обновлял. Оно просто перестало работать :man_shrugging: Я обновляюсь только когда переустанавливаю винду или когда что-то перестаёт работать.
Кстати, а на вижуалке код с этой строчкой нормально компилируется :thinking:
Перезагрузился - не помогло.
Компиляция из консоли тоже не помогает.

set compiler=g++
%compiler% -c src\main.cpp -o obj\main.o
%compiler% -o exe.exe obj\main.o -lopengl32 -lgdi32 -lglfw3 -LC:\MinGW\lib -IC:\MinGW\include

Собрал GLFW из исходников. Ошибок стало меньше. Теперь выдаёт это:



H:\Projects\c\OpenGL\test_minimal_render_GLFW_CodeBlocks>compile.bat

H:\Projects\c\OpenGL\test_minimal_render_GLFW_CodeBlocks>set compiler=g++

H:\Projects\c\OpenGL\test_minimal_render_GLFW_CodeBlocks>set paths=-LC:\libs\GLFW\libs\lib-mingw -IC:\libs\GLFW\include

H:\Projects\c\OpenGL\test_minimal_render_GLFW_CodeBlocks>g++ -c src\main.cpp -o obj\main.o

H:\Projects\c\OpenGL\test_minimal_render_GLFW_CodeBlocks>g++ -o exe.exe obj\main.o -lopengl32 -lgdi32 -lglfw3 -LC:\libs\GLFW\libs\lib-mingw -IC:\libs\GLFW\include
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_window.c.obj):win32_window.c:(.text+0x1f3): undefined reference to `CreateDIBSection@24'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_window.c.obj):win32_window.c:(.text+0x262): undefined reference to `CreateBitmap@20'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_window.c.obj):win32_window.c:(.text+0x28d): undefined reference to `DeleteObject@4'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_window.c.obj):win32_window.c:(.text+0x37b): undefined reference to `DeleteObject@4'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_window.c.obj):win32_window.c:(.text+0x389): undefined reference to `DeleteObject@4'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_window.c.obj):win32_window.c:(.text+0xba3): undefined reference to `CreateRectRgn@16'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_window.c.obj):win32_window.c:(.text+0xc02): undefined reference to `DeleteObject@4'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(wgl_context.c.obj):wgl_context.c:(.text+0x6c5): undefined reference to `DescribePixelFormat@16'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(wgl_context.c.obj):wgl_context.c:(.text+0xbbf): undefined reference to `DescribePixelFormat@16'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(wgl_context.c.obj):wgl_context.c:(.text+0xf4a): undefined reference to `SwapBuffers@4'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(wgl_context.c.obj):wgl_context.c:(.text+0x125b): undefined reference to `ChoosePixelFormat@8'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(wgl_context.c.obj):wgl_context.c:(.text+0x1276): undefined reference to `SetPixelFormat@12'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(wgl_context.c.obj):wgl_context.c:(.text+0x159f): undefined reference to `DescribePixelFormat@16'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(wgl_context.c.obj):wgl_context.c:(.text+0x15e6): undefined reference to `SetPixelFormat@12'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0x127): undefined reference to `CreateDCW@16'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0x160): undefined reference to `GetDeviceCaps@8'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0x179): undefined reference to `GetDeviceCaps@8'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0x1ca): undefined reference to `GetDeviceCaps@8'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0x24a): undefined reference to `GetDeviceCaps@8'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0x28f): undefined reference to `DeleteDC@4'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0xa26): undefined reference to `GetDeviceCaps@8'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0xa3f): undefined reference to `GetDeviceCaps@8'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0xed7): undefined reference to `CreateDCW@16'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0xef2): undefined reference to `GetDeviceGammaRamp@8'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0xf00): undefined reference to `DeleteDC@4'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0x1046): undefined reference to `CreateDCW@16'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0x1061): undefined reference to `SetDeviceGammaRamp@8'
C:\libs\GLFW\libs\lib-mingw/libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0x106f): undefined reference to `DeleteDC@4'
collect2.exe: error: ld returned 1 exit status

Эти ошибки означают, что не прилинкован GDI. Но сейчас-то он прилинкован! :dizzy_face: Чё ему тогда надо? :dadparrot:
О, слушайте! Я написал -lgdi32 после -lglfw3 и заработало! А наоборот не работает :dizzy_face: Это чё за приколы?
И при чём тут glfwSetWindowShouldClose()? :thinking:

Да, порядок может иметь значение.

linker - Why does the order in which libraries are linked sometimes cause errors in GCC? - Stack Overflow

В компиляторе студии вроде не имеет.

Я такое уже видел. Но с GLFW такого ни разу не было. Если порядок имеет значение, то почему это происходит только при вызове каких-то конкретных функций? :thinking:

Ну так они внутри наверно хотят функцию из той другой библиотеки. А если не вызывать их, то компилятор выкидывает их.

Выкидывать может оптимизатор. Компилятор то как выбросит?
Может действительно чего забыли подключить и оно возвращает ошибку?

Надо было написать -lgdi32 после -lglfw3. Но я не помню, что раньше это имело значение :thinking:

Так это часть компилятора. Компилятор — Википедия

Ну и вообще я не про конкретные компоненты компилятора говорил, а про то, что где-то после вызова команды превращения исходного кода в программу (gcc -lbiblioteka1 -lbiblioteka2 source.cpp -o app.exe) неиспользуемые функции статических библиотек будут выкинуты.

Или вот даже без библиотек пример.
Ошибка будет только если попытаться вызвать f.

#include <iostream>

void f(); // undefined

int main()
{
    std::cout<<"Hello World";
    
    //f();

    return 0;
}

https://onlinegdb.com/w6LLOEraL