在 C++ 神情中援用動(dòng)態(tài)采集庫(kù) (DLL) 時(shí),常會(huì)遭遇一些常見問(wèn)題:無(wú)法貫通標(biāo)志(LNK2019),為什么動(dòng)態(tài)采集庫(kù)失效,以及架構(gòu)不匹配的突破(LNK4272)。本文將從上述問(wèn)題登程,進(jìn)行深度貫通,并提供一個(gè)設(shè)施搞定有設(shè)想。
一、問(wèn)題分析
在援用 DLL 時(shí),您可能會(huì)遭遇如下問(wèn)題:
LNK2019: 無(wú)法貫通的外部標(biāo)志 這類造作暗示在編譯時(shí)找不到調(diào)用函數(shù)的罷了(如“hid_write”)。 LNK4272: 架構(gòu)突破問(wèn)題 經(jīng)常為您的神情打包架構(gòu)(x86 或 x64)與庫(kù)不一致。 DLL 編譯環(huán)境和文獻(xiàn)旅途問(wèn)題 為什么聯(lián)接經(jīng)由中依然指定了庫(kù),仍然無(wú)法貫通標(biāo)志?舉個(gè)示例,若是您援用了不匹配架構(gòu)的 .lib 文獻(xiàn),就會(huì)出現(xiàn)該問(wèn)題。 二、設(shè)施搞定問(wèn)題
底下是搞定進(jìn)度的潛入分析:
張開剩余81%
設(shè)施1:確保正確存在庫(kù)文獻(xiàn)
確保您援用的動(dòng)態(tài)庫(kù) .dll 和對(duì)應(yīng)的靜態(tài)庫(kù) .lib 文獻(xiàn)王人存在。 搜檢存在旅途:確保 .lib 文獻(xiàn)被正確指向到神情的 采集器 -> 輸入 -> 附加依賴項(xiàng) 中。 在您的神情屬性中,干涉“采集器 -> 輸入”: 確保附加依賴項(xiàng)中依然存在“hidapi.lib”。 采集器 -> 慣例 -> 附加庫(kù)目次 ,確保骨子文獻(xiàn)旅途依然被指向。
設(shè)施2:確保架構(gòu)匹配
搜檢神情打包架構(gòu): 在 Visual Studio 中,干涉“建樹管制器”,確保您的平臺(tái)修復(fù)為 Win32 (如是 x86) 或 x64 (如是 64 位平臺(tái))。 確保動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)文獻(xiàn)的架構(gòu)與您的骨子建樹一致。 若是架構(gòu)突破,保舉重新編譯: 下載源碼和 CMake 器具,通過(guò)重新構(gòu)建生成匹配架構(gòu)的庫(kù)文獻(xiàn)。
設(shè)施3:確保標(biāo)志罷了和調(diào)用一致
搜檢源代碼中是否罷了了標(biāo)志: 若是您使用的是 hidapi 庫(kù),確保您的頭文獻(xiàn) hidapi.h 包括了通盤需要調(diào)用的函數(shù)。 使用 extern "C" 幸免標(biāo)志修飾突破: 若是您的庫(kù)是用 C 進(jìn)行編寫的,而神情是用 C++ 編寫的,需要在頭文獻(xiàn)中包裹如下代碼:
#ifdef __cplusplus
extern "C" {
#endif
// hidapi.h 內(nèi)容...
#ifdef __cplusplus
}
#endif
設(shè)施4:檢驗(yàn)動(dòng)態(tài)庫(kù)調(diào)用是否平方
使用 dumpbin 器具檢驗(yàn) DLL 導(dǎo)出標(biāo)志: 在 Visual Studio 敕令行中運(yùn)轉(zhuǎn)如下敕令: dumpbin /exports hidapi.dll 確保您需要調(diào)用的標(biāo)志存在于輸出列表中。 確保調(diào)用時(shí)旅途正確: 確保 .dll 文獻(xiàn)放在您骨子執(zhí)行文獻(xiàn)旅途中,能夠?qū)⒙猛咎砑拥?PATH 環(huán)境變量。 三、其他問(wèn)題
一、編譯器在嘗試編譯時(shí)找不到 hidapi.h 頭文獻(xiàn)。以下是搞定該問(wèn)題的一些模范和設(shè)施:
可能原因和搞定模范
1. 頭文獻(xiàn)旅途未正確修復(fù)
確保 hidapi.h 文獻(xiàn)骨子存在。 闡明文獻(xiàn)旅途是否已包含在神情的附加包含目次中。
搞定模范:
右鍵點(diǎn)擊你的神情,選擇 屬性 (Properties)。 在屬性窗口中: 找到 C/C++ → 附加包含目次 (Additional Include Directories)。 添加 hidapi.h 地方的文獻(xiàn)夾旅途。 點(diǎn)擊 詳情,重新編譯。
二、對(duì)于造作 C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
是由于 Microsoft Visual Studio 默許啟用了安全檢驗(yàn),辭讓使用不安全的 C 函數(shù)(如 strcpy、sprintf 等)。這些函數(shù)可能會(huì)導(dǎo)致緩沖區(qū)溢出,從而激發(fā)安全問(wèn)題。
不錯(cuò)通過(guò)以下幾種狀貌搞定:
1. 使用安全函數(shù) strcpy_s
strcpy_s 是 strcpy 的安全版塊,條目提供設(shè)想緩沖區(qū)的大小,以幸免緩沖區(qū)溢出。
2. 禁用 _CRT_SECURE_NO_WARNINGS
若是不念念修改代碼,不錯(cuò)通過(guò)禁用 Visual Studio 的安全檢驗(yàn)來(lái)幸免報(bào)錯(cuò)。
模范:
添加預(yù)處理器界說(shuō): 右鍵神情 -> 屬性 -> 建樹屬性 -> C/C++ -> 預(yù)處理器 -> 預(yù)處理器界說(shuō)。 添加:
_CRT_SECURE_NO_WARNINGS
2.代碼中全局界說(shuō): 在代碼頂部添加:
#define _CRT_SECURE_NO_WARNINGS
細(xì)心:禁用安全檢驗(yàn)可能導(dǎo)致潛在的安全風(fēng)險(xiǎn),提出僅在填塞闡明代碼安全的情況下使用。
發(fā)布于:廣東省