共用方式為


嚴重錯誤 C1083

無法開啟 filetype 檔案: 'file': message

編譯程式在找不到檔案時,會產生 C1083 錯誤。 此錯誤有許多可能的原因。 不正確的包括搜尋路徑或遺失或未命名的頭檔是最常見的原因,但其他檔類型和問題也可能導致 C1083。 以下是編譯程式產生此錯誤的一些常見原因。

指定的檔案名稱錯誤

檔名可能輸入錯誤。 例如,

#include <algorithm.h>

可能沒有找到您要的檔案。 大部分的 C++ 標準連結庫頭檔沒有 .h 擴展名。 此 #include 指示詞找不到 <algorithm> 標頭。 若要修正此問題,請確認輸入正確的檔名,如下所示:

#include <algorithm>

某些 C 執行階段程式庫標頭位於標準 Include 目錄的子目錄中。 例如,若要包含 sys/types.h,您必須 sys 在 指示詞中包含 #include 子目錄名稱:

#include <sys/types.h>

檔案未包含在 include 搜尋路徑中

編譯程式無法使用 或 #import 指示詞的#include搜尋規則來尋找檔案。 例如,當標題檔名以引號括住時,

#include "myincludefile.h"

這會告訴編譯程式先在包含來源檔案的相同目錄中尋找檔案,然後查看組建環境所指定的其他位置。 如果引號中含有絕對路徑,則編譯器只會在該位置尋找檔案。 如果引號中含有相對路徑,則編譯器會在來源目錄相對的目錄中尋找檔案。

如果名稱是以角括弧括住,

#include <stdio.h>

編譯程式會遵循建置環境、編譯程式選項、/I/X編譯程式選項和 INCLUDE 環境變數所定義的搜尋路徑。 如需詳細資訊,包括用來尋找檔案之搜尋順序的特定詳細數據,請參閱 #include 指示詞 (C/C++)#import 指示詞

如果您的 Include 檔案位於另一個相對於來源目錄的目錄中,而且您在 include 指示詞中使用相對路徑,則必須使用雙引號,而不是角括弧。 例如,如果您的頭檔 myheader.h 位於名為標頭的專案來源子目錄中,則此範例找不到檔案並導致 C1083:

#include <headers\myheader.h>

但此範例的運作方式如下:

#include "headers\myheader.h"

相對路徑也可以與 include 搜尋路徑上的目錄搭配使用。 如果您將目錄新增至 INCLUDE 環境變數或 Visual Studio 中的 Include 目錄路徑,請勿將路徑的一部分新增至 include 指示詞。 例如,如果您的標頭位於 \path\example\headers\myheader.h,而且您在 Visual Studio 中新增 \path\example\headers\ 至 Include Directory 路徑,但您的 #include 指示詞會將 檔案稱為

#include <headers\myheader.h>

找不到檔案。 使用與 include 搜尋路徑中指定的目錄相對的正確路徑。 在此範例中,您可以將 include 搜尋路徑變更為 \path\example\,或從 #include 指示詞中移除headers\路徑區段。

第三方連結庫問題和 vcpkg

如果您在嘗試將第三方連結庫設定為組建的一部分時看到此錯誤,請考慮使用 C++ 套件管理員 vcpkg 來安裝和建置連結庫。 vcpkg 支援大量且成長 的第三方連結庫清單,並設定成功建置所需的所有組態屬性和相依性,作為專案的一部分。

檔案位於您的專案中,但不包含包含搜尋路徑

即使頭檔列在 方案總管 作為專案的一部分,編譯程式只會在原始程序檔中#include#import 指示詞參考檔案時找到這些檔案,而且位於 include 搜尋路徑中。 不同類型的組建可能會使用不同的搜尋路徑。 編譯 /X 程式選項可用來排除包含搜尋路徑中的目錄。 這樣可讓不同的組建使用同名但存放在不同目錄下的 Include 檔案。 這是除了使用前置處理器命令進行條件式編譯以外的另一種作法。 如需編譯程式選項的詳細資訊/X,請參閱/X(忽略標準 Include 路徑)。

若要修正此問題,請修正編譯器用來搜尋包含或匯入之檔案的路徑。 新的專案會使用預設的 include 搜尋路徑。 您可能必須修改 include 搜尋路徑,以新增項目的目錄。 如果您要在命令行上編譯,請將路徑新增至 INCLUDE 環境變數或 /I 編譯程式選項,以指定檔案的路徑。

若要在 Visual Studio 中設定 Include 目錄路徑,請開啟專案的 [屬性頁 ] 對話方塊。 在左窗格中的 [組態屬性] 下,選取 [VC++ 目錄],然後編輯 [包含目錄] 屬性。 如需 Visual Studio 中編譯程式所搜尋之每個使用者和個別專案目錄的詳細資訊,請參閱 VC++ 目錄屬性頁。 如需編譯程式選項的詳細資訊/I,請參閱/I(其他 Include 目錄)。

未設定命令列 INCLUDE 或 LIB 環境

在命令列叫用編譯器時,通常會使用環境變數指定搜尋路徑。 如果 INCLUDE 或 LIB 環境變數所描述的搜尋路徑未正確設定,則可以產生 C1083 錯誤。 強烈建議使用開發人員命令提示字元快捷方式來設定命令行組建的基本環境。 如需詳細資訊,請參閱 在命令行上建置 C/C++。 如需如何使用環境變數的詳細資訊,請參閱 如何:在組建中使用環境變數。

檔案可能已鎖定或使用中

如果您使用另一個程式來編輯或存取檔案,它可能會鎖定檔案。 請嘗試關閉其他程式中的檔案。 如果您使用平行編譯選項,則其他程式有時可以是Visual Studio本身。 如果關閉平行建置選項會使錯誤消失,則這是問題。 其他平行建置系統也可以有此問題。 請小心設定檔案和專案相依性,讓建置順序正確。 在某些情況下,請考慮建立中繼專案來強制建置多個專案可能建置之通用檔案的相依性順序。 有時候防毒程式會暫時鎖定最近變更的檔案以進行掃描。 可能的話,請考慮從防毒掃描器排除您的專案組建目錄。

包含錯誤的檔案名稱版本

C1083 錯誤也可能表示包含了錯誤版本的檔案。 例如,組建可能包含錯誤的檔案版本,該檔案的 #include 指示詞適用於該組建的頭檔。 例如,某些檔案可能只適用於 x86 組建,或套用至偵錯組建。 找不到頭檔時,編譯程式會產生 C1083 錯誤。 若要修正這個問題,請使用正確的檔案,而不是將標頭檔或目錄加入至組建中。

先行編譯的標頭尚未先行編譯

當項目設定為使用先行編譯標頭時,必須建立相關的 .pch 檔案,才能編譯使用標頭內容的檔案。 例如, pch.cpp 會在新專案的專案目錄中自動建立檔案 (stdafx.cpp 在 Visual Studio 2017 和更早版本中)。 請先編譯該檔案以建立先行編譯標頭檔 在一般建置程序設計中,這會自動完成。 如需詳細資訊,請參閱 建立先行編譯頭檔

其他原因

  • 您已安裝 SDK 或第三方連結庫,但尚未開啟新的開發人員命令提示字元。 如果 SDK 或連結庫將檔案新增至 INCLUDE 路徑,您可能需要開啟新的開發人員命令提示字元視窗,以挑選這些環境變數變更。

  • 檔案使用Managed程式代碼,但未指定編譯程序選項 /clr 。 如需詳細資訊,請參閱 /clr (Common Language Runtime 編譯)

  • 檔案是使用與用來預先編譯標頭不同的 /analyze 編譯程式選項設定來編譯。 當項目的標頭先行編譯時,所有專案都應該使用相同的 /analyze 設定。 如需詳細資訊,請參閱/analyze(程序代碼分析)。

  • 檔案或目錄是由 Windows 子系統 Linux 版 所建立,已啟用每個目錄區分大小寫,而路徑或檔案的指定大小寫不符合磁碟上路徑或檔案的案例。

  • 檔案、目錄或磁碟為唯讀。

  • Visual Studio 或命令行工具沒有足夠的許可權可讀取檔案或目錄。 例如,當專案檔擁有與執行 Visual Studio 的進程或命令行工具不同的擁有權時,就會發生這種情況。 有時候,執行 Visual Studio 或開發人員命令提示字元作為 管理員 istrator,即可修正此問題。

  • 檔句柄不足。 請關閉部分應用程式,再重新編譯。 在一般情況下,這種狀況並不常見。 不過,在實體記憶體有限的電腦上建置大型專案時,有可能會發生這種狀況。

範例

當頭檔 "test.h" 不存在於來源目錄或包含搜尋路徑時,下列範例會產生 C1083 錯誤。

// C1083.cpp
// compile with: /c
#include "test.h"   // C1083 test.h doesn't exist
#include "stdio.h"  // OK

如需如何在 IDE 或命令行上建置 C/C++ 專案的相關信息,以及設定環境變數的相關信息,請參閱 專案和建置系統

另請參閱