使用AssocQueryStringW时出现undefined reference链接错误排查
问题
尝试用ShellExecute打开jpg文件,无文件关联时无法正常工作。使用AssocQueryString检查jpg是否存在关联时,编译报错:undefined reference to '__imp_AssocQueryStringA'。
开发环境:VS Code + msys64
编译参数:
args": [ "-fdiagnostics-color=always", "-g", "-std=c++20", "-L.", //"-mwindows", //"-static", "-static-libgcc", "-static-libstdc++", "-lshlwapi", //"-libs", "${file}", "Resources\\icon.res", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ]
代码:
#include <windows.h> #include <filesystem> #include <fstream> #include <iostream> #include <Shlwapi.h> bool Test_FileExtension(const std::string& weirdassextension); int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int cmdShow) { bool test = Test_FileExtension("jpg"); std::cout << test << std::endl; } bool Test_FileExtension(const std::string& weirdassextension){ WCHAR wbuffPath[MAX_PATH] = {0}; DWORD dwszBuffPath = MAX_PATH; std::wstring stemp = L"." + std::wstring(weirdassextension.begin(), weirdassextension.end()); LPCWSTR sw = stemp.c_str(); HRESULT hR = ::AssocQueryStringW(ASSOCF_INIT_IGNOREUNKNOWN, ASSOCSTR_EXECUTABLE, sw, NULL, wbuffPath, &dwszBuffPath); if(hR == 0x80070483) // HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION) { return false; } else { return true; } }
已确认shlwapi.h存在于C:\Program Files\msys64\mingw64\include\shlwapi.h,需排查错误原因。
解决方法
- 调整链接库顺序:MinGW编译器要求链接库参数(
-lshlwapi)必须放在源文件和资源文件之后。当前编译参数中-lshlwapi在源文件前,会导致链接器无法找到函数定义。修改后将-lshlwapi移到Resources\\icon.res之后:
args": [ "-fdiagnostics-color=always", "-g", "-std=c++20", "-L.", //"-mwindows", //"-static", "-static-libgcc", "-static-libstdc++", "${file}", "Resources\\icon.res", "-lshlwapi", //"-libs", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ]
- 确认宽字符宏定义:代码使用宽字符版本
AssocQueryStringW,需确保编译时未强制使用ANSI版本。可在代码开头添加宏定义:
#define UNICODE #define _UNICODE #include <windows.h> #include <filesystem> #include <fstream> #include <iostream> #include <Shlwapi.h>
- 检查库文件完整性:确认
mingw64/lib目录下存在libshlwapi.a或libshlwapi.dll.a,若缺失需重新安装mingw相关组件。
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

