共用方式為


連結器工具錯誤 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++>程式代碼產生] 頁面中。

來自在線或其他來源之專案中的連結庫

如果您建置從另一部計算機複製的項目,連結庫安裝位置可能會不同。 針對命令行組建,請確認已針對組建正確設定 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 位工具組的詳細資訊,請參閱 如何:在命令行上啟用 64 位 Visual C++ 工具組。 如需如何在 IDE 中使用 64 位工具組的資訊,請參閱 搭配 64 位編譯程式和工具使用 MSBuild。 另請參閱此 Stack Overflow 文章: 如何讓 Visual Studio 使用原生 amd64 工具鏈

不正確的檔案許可權

如果您的檔案許可權不足而無法存取 檔名,就可能發生此錯誤。 如果您使用一般使用者帳戶來存取受保護系統目錄中的連結庫檔案,可能會發生這種情況。 或者,如果您使用從其他使用者複製的檔案,這些檔案仍已設定其原始許可權。 若要修正此問題,請將檔案移至可寫入的項目目錄。 如果移動的檔案具有無法存取的許可權,請在 管理員 istrator 命令視窗中執行 takeown.exe 命令,以取得檔案的擁有權。

磁碟空間不足

當您沒有足夠的磁碟空間時,可能會發生錯誤。 連結器在幾種情況下會使用暫存檔。 即使您有足夠的磁碟空間,大型連結仍可能會耗盡或分散可用的磁碟空間。 請考慮使用 /OPT (優化) 選項;執行可轉移的 COMDAT 刪除作業會多次讀取所有物件檔案。

TMP 環境變數中的問題

如果檔名命名為 LNKnnn,則它是暫存盤連結器所產生的檔名。 TMP 環境變數中指定的目錄可能不存在。 或者,可能會為TMP環境變數指定多個目錄。 TMP 環境變數應該只指定一個目錄路徑。

說明,我的問題未列在這裡!

當此處所列的問題都不適用時,您可以使用 Visual Studio 中的意見反應工具來取得協助。 在 IDE 中,移至功能表欄,然後選擇 [ 說明 > 傳送意見反應 > 回報問題]。 或者,使用 [說明 > 傳送意見 > 反應傳送建議] 來提交建議。 您也可以使用 Microsoft Learn Q&A 網站進行問題,以及 Visual Studio C++ 開發人員社群 網站。 使用這些網站來搜尋問題的解答,並尋求協助。 如需詳細資訊,請參閱 如何回報 Visual C++ 工具組或文件的問題。

如果您已發現修正此問題的新方法,我們應該新增至本文,請讓我們知道。 您可以使用下方 的 [此頁面] 按鈕,傳送意見反應給我們。 使用它來建立 C++ 檔中的新問題 GitHub 存放庫。 感謝您!