連結器工具錯誤 LNK1104
無法開啟檔案 'filename'
當連結器無法開啟檔案以供讀取或寫入時,就會報告此錯誤。 問題的兩個最常見原因是:
您的程式已在調試程式中執行或載入,且
您的連結庫路徑不正確,或未包裝在雙引號中。
此錯誤還有其他許多可能的原因。 若要縮小範圍,請先檢查檔案檔名的類型。 然後,使用下列各節來協助識別並修正特定問題。
無法開啟您的應用程式或其 .pdb 檔案
您的應用程式正在執行中,或是在調試程式中載入
當 filename 是可執行檔案的名稱或相關聯的 .pdb 檔案時,請參閱您的應用程式是否已執行中。 然後檢查是否在調試程式中載入。 若要修正此問題,請先停止程式,然後從調試程式卸除,再重新建置它。 如果應用程式在另一個程序中開啟,例如資源編輯器,請將其關閉。 如果您的程式沒有回應,您可能需要使用任務管理員來結束程式。 您可能也需要關閉並重新啟動 Visual Studio。
您的應用程式被防毒掃描鎖定
防病毒軟體程式通常會暫時封鎖對新建立檔案的存取,特別是.exe和.dll可執行檔。 若要修正此問題,請嘗試從防毒掃描器排除您的專案組建目錄。
無法開啟Microsoft連結庫檔案
Windows 連結庫,例如 kernel32.lib
如果無法開啟的檔案是Microsoft所提供的其中一個標準連結庫檔案,例如 kernel32.lib,您可能會有項目組態錯誤或安裝錯誤。 確認已安裝 Windows SDK。 如果您的專案需要其他Microsoft連結庫,例如 MFC,請確定 Visual Studio 安裝程式也已安裝 MFC 元件。 您可以再次執行安裝程式,隨時新增選擇性元件。 如需詳細資訊,請參閱修改 Visual Studio。 使用安裝程式中的 [ 個別元件 ] 索引標籤來選擇特定的連結庫和 SDK。
版本設定的 vcruntime 連結庫
如果錯誤訊息具有版本設定Microsoft連結庫,例如 msvcr120.lib,則可能不會安裝該編譯程式版本的平臺工具組。 若要修正此問題,您有兩個選項:升級專案以使用目前的平臺工具組,或安裝較舊的工具組並建置專案不變。 如需詳細資訊,請參閱 從舊版Visual C++ 升級專案和使用 Visual Studio中的原生多目標來建置舊專案。
零售、偵錯或平臺特定連結庫
當您第一次建置新的目標平臺或組態,例如 Retail 或 ARM64 時,可能會發生此錯誤。 在 IDE 中,確認已安裝 [一般] 屬性頁中指定的 [平臺工具組] 和 [Windows SDK 版本]。 此外,請確認 VC++ 目錄屬性頁中指定的 [連結庫目錄] 中有可用的必要連結庫。 檢查每個設定的屬性,例如Debug、Retail、x86或ARM64。 如果一個組建運作,但另一個組建無法運作,請比較兩者的設定。 安裝任何遺漏的必要工具和連結庫。
vccorlib.lib 連結庫
通用 Windows (UWP) 應用程式或元件沒有 Spectre 緩和的連結庫。 如果錯誤訊息包含 vccorlib.lib,您可能已在 UWP 項目中啟用 /Qspectre
。 停用編譯 /Qspectre
程式選項以修正此問題。 在 Visual Studio 中 ,變更 Spectre 風險降低 屬性。 其位於 [屬性頁] 對話框的 [C/C++>Code 產生] 頁面。
來自在線或其他來源之專案中的連結庫
如果您建置從另一部計算機複製的項目,連結庫安裝位置可能會不同。 針對命令行組建,請確認已針對組建正確設定 LIB 環境變數和連結庫路徑。 在 Visual Studio 中,您可以看到並編輯專案 [屬性] 頁面中設定的目前連結庫路徑。 在 [VC++ 目錄] 頁面中,選擇 [連結庫目錄] 屬性的下拉式控件,然後選擇 [編輯]。 [鏈接庫目錄] 對話方塊的 [評估值] 區段會列出搜尋連結庫檔案的目前路徑。 更新這些路徑以指向您的本機連結庫。
已更新 Windows SDK 連結庫
當 Windows SDK 的 Visual Studio 路徑過期時,就會發生此錯誤。 如果您安裝較新的 Windows SDK,與 Visual Studio 安裝程式無關,就可能發生此情況。 若要在 IDE 中修正它,請更新 VC++ 目錄屬性頁中指定的路徑。 設定路徑中的版本以符合新的 SDK。 如果您使用開發人員命令提示字元,請使用新的 SDK 路徑更新初始化環境變數的批次處理檔。 您可以使用 Visual Studio 安裝程式來安裝更新的 SDK 來避免此問題。
無法開啟第三方連結庫檔案
此問題有數個常見原因:
連結庫檔案的路徑可能不正確,或未包裝成雙引號。 或者,您可能尚未將它指定給連結器。
您可能已安裝 32 位版本的連結庫,但您正在建置 64 位,或其他方式。
連結庫可能相依於未安裝的其他連結庫。
若要修正命令行組建的路徑問題,請確認已設定 LIB 環境變數。 請確定它包含您使用之所有連結庫的路徑,以及針對您所建置的每個組態。 在 IDE 中,連結庫路徑是由 VC++ 目錄庫目錄>屬性所設定。 請確定這裡列出所有包含所需連結庫的目錄,以供您建置的每個組態使用。
您可能需要提供覆寫標準連結庫目錄的連結庫目錄。 在命令行上,使用 /LIBPATH
選項。 在 IDE 中,使用專案之 [組態屬性連結器>一般] > 屬性頁面中的 [其他連結庫目錄] 屬性。
請務必安裝建置組態所需的每個連結庫版本。 請考慮使用 vcpkg 套件管理公用程式,將許多通用連結庫的安裝和設定自動化。 您可以的話,最好建置您自己的第三方連結庫複本。 然後,您一定會擁有所有連結庫的本機相依性,其建置位置與專案相同的組態。
無法開啟專案所建置的檔案
如果 鏈接器嘗試存取檔名 ,您可能會看到此錯誤。 當某個專案相依於方案中的另一個專案,但專案會以錯誤的順序建置時發生。 若要修正此問題,請確定您的項目參考已在使用 檔案的項目中設定。 然後,遺失的檔案會在需要之前建置。 如需詳細資訊,請參閱 在Visual Studio中新增參考C++專案 和 管理專案中的參考。
無法開啟檔案 'C:\Program.obj'
如果您在錯誤訊息中看到檔名 C:\Program.obj ,請以雙引號包裝您的連結庫路徑。 當開頭為 C:\Program Files 的未包裝路徑傳遞至鏈接器時,就會發生此錯誤。 未包裝的路徑也可能造成類似的錯誤。 一般而言,它們會在磁碟驅動器的根目錄中顯示非預期的.obj檔案。
若要修正命令行組建的問題,請檢查 /LIBPATH 選項參數。 也請檢查 LIB 環境變數中指定的路徑,以及命令行上指定的路徑。 請務必在包含空格的任何路徑周圍使用雙引號。
若要修正 IDE 中的此問題,請視需要將雙引號新增至專案的下列屬性:
[組態屬性 > VC++ 目錄] 屬性頁面上的 [連結庫目錄] 屬性,
[組態屬性] 連結器 > [一般] > 屬性頁中的 [其他連結庫目錄] 屬性,
[組態屬性連結器>輸入] > 屬性頁中的 [其他相依性] 屬性。
其他常見問題
路徑或檔名問題
鏈接器指定的連結庫檔名或路徑不正確時,可能會發生此錯誤。 或者,當路徑具有無效的磁碟驅動器規格時。 查看命令行或任何 #pragma 批注(lib, “library_name” ) 指示詞中的問題。 檢查您的拼字和擴展名,並確認檔案存在於指定的位置。
平行建置同步處理
如果您使用平行建置選項,Visual Studio 可能會鎖定另一個線程上的檔案。 若要修正此問題,請確認多個專案中並未建置相同的程式代碼對象或連結庫。 使用組建相依性或項目參考來挑選專案中的建置二進位檔。
IDE 中指定的其他相依性
當您直接在 [其他相依性] 屬性中指定個別連結庫時,請使用空格來分隔連結庫名稱。 請勿使用逗號或分號。 如果您使用 [ 編輯 ] 功能表項來開啟 [ 其他相依性 ] 對話框,請使用換行符來分隔名稱,而非逗號、分號或空格。 當您在 [連結庫目錄] 和 [其他連結庫目錄] 對話框中指定連結庫路徑時,也會使用換行符。
太長的路徑
當檔名的路徑擴充到超過 260 個字元時,您可能會看到此錯誤。 如有需要,請重新排列目錄結構,或縮短資料夾和檔名以縮短路徑。
太大的檔案
因為檔案太大,因此可能會發生此錯誤。 大小超過 GB 的連結庫或物件檔案可能會導致 32 位連結器發生問題。 此問題的可能修正方式是使用64位工具組。 如需如何在命令行使用 64 位工具組的詳細資訊,請參閱 How to: Enable a 64-Bit Visual C++ Toolset on the Command Line。 如需如何在 IDE 中使用 64 位工具組的資訊,請參閱 搭配 64 位編譯程式和工具使用 MSBuild。 另請參閱此 Stack Overflow 文章: 如何讓 Visual Studio 使用原生 amd64 工具鏈。
不正確的檔案許可權
如果您的檔案許可權不足而無法存取 檔名,就可能發生此錯誤。 如果您使用一般使用者帳戶來存取受保護系統目錄中的連結庫檔案,可能會發生這種情況。 或者,如果您使用從其他使用者複製的檔案,這些檔案仍已設定其原始許可權。 若要修正此問題,請將檔案移至可寫入的項目目錄。 如果移動的檔案具有無法存取的許可權,請在系統管理員命令視窗中執行 takeown.exe 命令,以取得檔案的擁有權。
磁碟空間不足
當您沒有足夠的磁碟空間時,可能會發生錯誤。 連結器在幾種情況下會使用暫存檔。 即使您有足夠的磁碟空間,大型連結仍可能會耗盡或分散可用的磁碟空間。 請考慮使用 /OPT (優化) 選項;執行可轉移的 COMDAT 刪除作業會多次讀取所有物件檔案。
TMP 環境變數中的問題
如果檔名命名為 LNKnnn,則它是暫存盤連結器所產生的檔名。 TMP 環境變數中指定的目錄可能不存在。 或者,可能會為TMP環境變數指定多個目錄。 TMP 環境變數應該只指定一個目錄路徑。
說明,我的問題未列在這裡!
當此處所列的問題都不適用時,您可以使用 Visual Studio 中的意見反應工具來取得協助。 在 IDE 中,移至功能表欄,然後選擇 [ 說明 > 傳送意見反應 > 回報問題]。 或者,使用 [說明 > 傳送意見 > 反應傳送建議] 來提交建議。 您也可以針對問題使用 Microsoft Learn Q&A 網站,以及 Visual Studio C++ 開發人員社群 網站。 使用這些網站來搜尋問題的解答,並尋求協助。 如需詳細資訊,請參閱 如何回報 Visual C++ 工具組或文件的問題。
如果您已發現修正此問題的新方法,我們應該新增至本文,請讓我們知道。 您可以使用下方 的 [此頁面] 按鈕,傳送意見反應給我們。 使用它,在我們的 C++檔 GitHub 存放庫中建立新的問題。 感謝您!