0 Câu hỏi: Lỗi nghiêm trọng với afxv_w32.h: WINDOWS.H đã được bao gồm

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đang cố gắng xây dựng và chạy một dự án VS cũ (và khá lớn (khoảng hơn 100 tệp nguồn và tiêu đề)). Ban đầu nó được biên dịch bằng VS2012 và Windows 7, vì vậy tôi đang sử dụng cùng một thiết lập (trên thực tế, cả Win 7 và 10). Tôi mới làm quen với VS, vì vậy hãy đồng ý với tôi. Vấn đề của tôi là nó không xây dựng được với lỗi nghiêm trọng này:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxv_w32.h(16):
fatal error C1189: #error :  WINDOWS.H already included.
MFC apps must not #include <windows.h> (utils.cpp)```

Tôi thấy rằng nhiều người đã gặp phải vấn đề này. Ví dụ:

Tuy nhiên, tôi không thể tìm thấy giải pháp hiệu quả cho mình. Trước hết, theo như tôi biết, windows.h không được bao gồm bởi mã viết của chúng tôi, mà là bởi tệp afxv_w32.h. Tôi có tệp utils.h lưu trữ các nguyên mẫu hàm hữu ích, bao gồm tệp stdafx.h (bên dưới). Thông qua tùy chọn "Hiển thị bao gồm" tôi thấy rằng stdafx.h bao gồm afxwin.h, kết thúc bằng việc bao gồm afxv_w32.h với lỗi được đề cập; tuy nhiên, có vẻ như lỗi không được nêu ra mọi lúc. Ví dụ:

1>  Note: including file: i:\hmcdeliverables\sourcecode\processor\utils.h
1>  Note: including file:  i:\hmcdeliverables\sourcecode\processor\stdafx.h
1>  Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin.h
1>  Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afx.h
1>  Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\new.h
1>  Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\crtdefs.h
1>  Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxver_.h
1>  Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxv_w32.h
1>  Note: including file:       C:\Program Files (x86)\Windows Kits\8.0\Include\um\winsdkver.h
1>  Note: including file:        C:\Program Files (x86)\Windows Kits\8.0\Include\shared\winapifamily.h
1>  Note: including file:       C:\Program Files (x86)\Windows Kits\8.0\Include\shared\sdkddkver.h
1>  Note: including file:       C:\Program Files (x86)\Windows Kits\8.0\Include\um\windows.h
1>  Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\excpt.h
1>  Note: including file:         C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\crtdefs.h
.
.    Some lines later...
.

1>  Note: including file: i:\hmcdeliverables\sourcecode\processor\utils.h
1>  Note: including file:  i:\hmcdeliverables\sourcecode\processor\stdafx.h
1>  Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin.h
1>  Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afx.h
1>  Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\new.h
1>  Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\crtdefs.h
1>  Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxver_.h
1>  Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxv_w32.h
1>  C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxv_w32.h(16): fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>

utils.h đang được sử dụng trong nhiều tệp của dự án này; tuy nhiên, tôi sử dụng bảo vệ

#pragma once

để xử lý nó chỉ một lần (nếu tôi hiểu chính xác điều này). Một đoạn trích từ "utils.h":

#pragma once

#include "stdafx.h"
#include <string>
#include <opencv2/opencv.hpp>
#include <cstdint>

Tệp stdafx.h của tôi:

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently

#pragma once

#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN        // Exclude rarely-used stuff from Windows headers
#endif

// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER              // Allow use of features specific to Windows XP or later.
#define WINVER 0x0501       // Change this to the appropriate value to target other versions of Windows.
#endif

#ifndef _WIN32_WINNT        // Allow use of features specific to Windows XP or later.                   
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif                      

#ifndef _WIN32_WINDOWS      // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif

#ifndef _WIN32_IE           // Allow use of features specific to IE 6.0 or later.
#define _WIN32_IE 0x0600    // Change this to the appropriate value to target other versions of IE.
#endif

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS  // some CString constructors will be explicit

// turns off MFC's hiding of some common and often safely ignored warning messages
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions


#include <afxdisp.h>        // MFC Automation classes



#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>       // MFC support for Internet Explorer 4 Common Controls
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>         // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

Tôi nên kiểm tra hoặc thay đổi ở đâu để giải quyết vấn đề này? Hãy cho tôi biết nếu cần thêm thông tin.

    
0
  1. stdafx.h là tệp tiêu đề được biên dịch trước. Nó phải được #incoled trong tệp .cpp tận dụng lợi thế của nó và là #incolee đầu tiên, không bao giờ bằng tệp .h. Khó có thể đoán làm thế nào điều này có thể được xây dựng đúng cách trước đây, nhưng chúng ta không thể là #inc loại được sử dụng bởi utils.cpp. Tệp mà nó thực sự đang phàn nàn.
    2019-05-08 16: 31: 21Z
  2. không liên quan: Visual Studio 2012 đã lỗi thời 5 năm rồi. Cân nhắc nâng cấp lên Visual Sudio 2017 hoặc 2019. Phiên bản Cộng đồng miễn phí.
    2019-05-08 16: 39: 16Z
  3. Tôi muốn xem xét sử dụng API là windows 7 và mới hơn ... nhưng đó là tôi
    2019-05-08 17: 43: 28Z
  4. @ HansPassant nếu tôi hiểu đúng về bạn, tôi không nên bao gồm tệp tiêu đề được biên dịch trước trong một tệp tiêu đề (.h), mà chỉ #inc loại trừ nó trong nguồn (.cpp) tập tin? Ngoài ra, ý của bạn là '..., không bao giờ bởi tệp .h'?
    2019-05-08 21: 10: 30Z
0 Câu trả lời                              0                         
nguồn đặt đây