You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MSYS2 UCRT64链接MinGW库时出现未定义引用错误求助

问题描述

通过MSYS2 UCRT64安装MinGW与CMake,尝试基于IUP和NAppGUI构建GUI应用时,多次在链接阶段失败,提示undefined reference to XXX错误,涉及的函数包括:

  • GdipFree、GdiplusStartup、GdiplusShutdown(GDI+相关)
  • __imp_GetThemeFont、__imp_GetThemePartSize(主题API相关)
  • __imp_InitCommonControlsEx(通用控件相关)
  • __imp___argc、__imp___argv(全局参数相关)
  • _setjmp(标准库相关)

已尝试的操作:

  • 通过scoop重装MinGW
  • 改用Ninja替代Make构建
  • 严格按照IUP和NAppGUI官方教程构建示例应用

NAppGUI构建日志

[main] Building folder: nappgui_test 
[main] Configuring project: nappgui_test 
[proc] Executing command: C:\msys64\ucrt64\bin\cmake.EXE --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_C_COMPILER:FILEPATH=C:\msys64\ucrt64\bin\gcc.exe -DCMAKE_CXX_COMPILER:FILEPATH=C:\msys64\ucrt64\bin\g++.exe -SC:/Users/avila/nappgui_test -Bc:/Users/avila/nappgui_test/build -G "MinGW Makefiles"
[cmake] Not searching for unused variables given on the command line.
[cmake] CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):
[cmake]   Compatibility with CMake < 3.5 will be removed from a future version of
[cmake]   CMake.
[cmake] 
[cmake]   Update the VERSION argument <min> value or use a ...<max> suffix to tell
[cmake]   CMake that the project does not need compatibility with older versions.
[cmake] 
[cmake] 
[cmake] Found NAppGUI at 'C:/Users/avila/nappgui'
[cmake]    Version: 1.4.2.5131
[cmake]    Linker: static
[cmake] -- - [OK] napphello: Desktop application
[cmake] -- Configuring done (0.2s)
[cmake] -- Generating done (0.1s)
[cmake] -- Build files have been written to: C:/Users/avila/nappgui_test/build
[build] Starting build
[proc] Executing command: chcp
[proc] Executing command: C:\msys64\ucrt64\bin\cmake.EXE --build c:/Users/avila/nappgui_test/build --config Debug --target all -j 10 --
[build] [ 33%] Building C object hello/CMakeFiles/napphello.dir/napphello.c.obj
[build] [ 66%] Building RC object hello/CMakeFiles/napphello.dir/res.rc.obj
[build] [100%] Linking CXX executable ..\Debug\bin\napphello.exe
[build] C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/avila/nappgui/lib/libosgui.a(osdrawctrl.cpp.obj): in function `osdrawctrl_font':
[build] C:/Users/avila/nappgui_src/src/osgui/win/osdrawctrl.cpp:57:(.text+0x1007e): undefined reference to `__imp_GetThemeFont'
[build] C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/avila/nappgui/lib/libosgui.a(osdrawctrl.cpp.obj): in function `i_sort_size':
[build] C:/Users/avila/nappgui_src/src/osgui/win/osdrawctrl.cpp:211:(.text+0x104bd): undefined reference to `__imp_GetThemePartSize'
[build] C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/avila/nappgui/lib/libosgui.a(osgui_win.cpp.obj): in function `osgui_start_imp':
[build] C:/Users/avila/nappgui_src/src/osgui/win/osgui_win.cpp:459:(.text+0x115aa): undefined reference to `__imp_InitCommonControlsEx'
[build] C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/avila/nappgui_src/src/osgui/win/osgui_win.cpp:476:(.text+0x11659): undefined reference to `GdiplusStartup'
[build] C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/avila/nappgui/lib/libosgui.a(osgui_win.cpp.obj): in function `osgui_finish_imp':
[build] C:/Users/avila/nappgui_src/src/osgui/win/osgui_win.cpp:592:(.text+0x11aa2): undefined reference to `GdiplusShutdown'
.
.
.
[build] collect2.exe: error: ld returned 1 exit status
[build] mingw32-make[2]: *** [hello\CMakeFiles\napphello.dir\build.make:115: Debug/bin/napphello.exe] Error 1
[build] mingw32-make[1]: *** [CMakeFiles\Makefile2:97: hello/CMakeFiles/napphello.dir/all] Error 2
[build] mingw32-make: *** [Makefile:135: all] Error 2
[proc] The command: C:\msys64\ucrt64\bin\cmake.EXE --build c:/Users/avila/nappgui_test/build --config Debug --target all -j 10 -- exited with code: 2
[driver] Build completed: 00:00:04.892
[build] Build finished with exit code 2

IUP构建日志

[main] Building folder: iup_test 
[build] Starting build
[proc] Executing command: C:\msys64\ucrt64\bin\cmake.EXE --build c:/Users/avila/iup_test/build --config Debug --target all --
[build] [1/1 100% :: 0.335] Linking C executable iup_test.exe
[build] FAILED: iup_test.exe 
[build] C:\WINDOWS\system32\cmd.exe /C "cd . && C:\msys64\ucrt64\bin\cc.exe -g  CMakeFiles/iup_test.dir/main.c.obj -o iup_test.exe -Wl,--out-implib,libiup_test.dll.a -Wl,--major-image-version,0,--minor-image-version,0  C:/Users/avila/iup_test/iup/libiup.a  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
[build] C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/avila/iup_test/iup/libiup.a(iupwin_open.o):iupwin_open.c:(.text+0x160): undefined reference to `__imp_InitCommonControlsEx'
.
.
.
[build] C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/avila/iup_test/iup/libiup.a(iupwindows_main.o):iupwindows_main.c:(.rdata$.refptr.__imp___argc[.refptr.__imp___argc]+0x0): undefined reference to `__imp___argc'
[proc] The command: C:\msys64\ucrt64\bin\cmake.EXE --build c:/Users/avila/iup_test/build --config Debug --target all -- exited with code: 1
[build] C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/avila/iup_test/iup/libiup.a(iupwindows_main.o):iupwindows_main.c:(.rdata$.refptr.__imp___argv[.refptr.__imp___argv]+0x0): undefined reference to `__imp___argv'
[build] collect2.exe: error: ld returned 1 exit status
[build] ninja: build stopped: subcommand failed.
[driver] Build completed: 00:00:00.428
[build] Build finished with exit code 1

解决方案

这些错误均为链接阶段缺少对应Windows系统库或编译选项导致,按以下步骤修复:

1. 补充缺失的Windows系统库

在CMakeLists.txt中,为目标添加以下链接库:

  • comctl32:解决通用控件、主题API函数缺失
  • gdiplus:解决GDI+相关函数缺失
  • msvcrt:解决全局参数__imp___argc/__imp___argv缺失

示例配置:

# NAppGUI项目
target_link_libraries(napphello PRIVATE
    nappgui
    comctl32
    gdiplus
    msvcrt
)

# IUP项目
target_link_libraries(iup_test PRIVATE
    libiup.a
    comctl32
    gdiplus
    msvcrt
)

2. 调整编译与链接选项

针对UCRT64环境,添加以下选项确保兼容性:

# 启用宽字符API支持
add_compile_options(-municode)
# 静态链接GCC/C++标准库,避免动态依赖问题
add_link_options(-static-libgcc -static-libstdc++)

3. 检查库的工具链兼容性

确保使用的IUP/NAppGUI预编译库是针对MinGW UCRT64编译的,若为MSVC或旧版MinGW(如win32/posix分支)编译的库,会出现链接不兼容问题。建议:

  • 下载官方提供的UCRT64版本预编译库
  • 或自行用UCRT64的MinGW工具链重新编译IUP/NAppGUI源码

4. 修复_setjmp未定义错误

若仍存在该错误,显式链接标准数学库:

target_link_libraries(your_target PRIVATE m)

内容的提问来源于stack exchange,提问作者AvlKP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:17:01