筆者在開發中出現的bug完整報錯如下:
spcm_ostools_win.obj:-1: error: LNK2019: 無法解析的外部符號 __imp_OpenClipboard,函數 "void __cdecl spcmdrv::vCopyToClipboard(char const *,unsigned __int64)" (?vCopyToClipboard@spcmdrv@@YAXPEBD_K@Z) 中引用了該符號
依然是常見的鏈接不到宏定義/函數的問題,但是這次不同的是,報錯的符號來自:C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\um\WinUser.h
也就是windows SDK下的頭文件和庫。
分析:
1. 通常來講出現這個問題首先考慮的原因是編譯器的選擇,因為這是Visual Studio配置環境時要下載的windows sdk組件,也就是說,只有在MSVC模式下才能用上,MinGW是Qt自帶的編譯器,是沒有這個套件的。所以應該先檢查當前的構建套件是不是有效的MSVC20XX。
2. 然后應該檢查windows kits的 Include、Lib、bin 文件是不是添加到了系統的環境變量里
排查了這兩個問題以后,報錯依然沒有消失,說明編譯器依然沒有找到對應的windows API,筆者嘗試使用手動添加LIB和INCLUDE 路徑的方式,試圖讓編譯器找到符號對應的頭文件,語句如下:
win32 {INCLUDEPATH += "C:/Program Files (x86)/Windows Kits/10/Include/10.x.x.x/ucrt"INCLUDEPATH += "C:/Program Files (x86)/Windows Kits/10/Include/10.x.x.x/um"# 根據需要添加其他目錄
}win32 {LIBS += -L"C:/Program Files (x86)/Windows Kits/10/Lib/10.x.x.x/ucrt/x64"LIBS += -L"C:/Program Files (x86)/Windows Kits/10/Lib/10.x.x.x/um/x64"# 根據需要添加其他目錄或特定庫文件
}
并無卵用......
經多次失敗經驗證明,試圖通過添加上述語句完成添加外部庫,從而讓編譯器找到庫文件,完全行不通!!!!!!編譯器不會報錯,但是也不會找到里面的lib文件!!!無論是什么庫!
這個符號屬于Windows API的一部分,通常與用戶32庫(User32.lib)相關聯。只需要在.pro文件中,增加下述語句,就可以了。
win32 {LIBS += -lUser32
}
對應地,在使用這個符號的代碼文件中,需要引入windows頭文件
#include <windows.h>
清除之前的構建,重新構建工程,報錯就消失了