使用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
相关产品推荐
相关产品推荐

