Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

Visual C++ - error C1083: Cannot open include file: 'float.h': No such file or directory

"Platform Toolset"이 "Visual Studio 2017 - Windows XP (v141_xp)"로 설정된 Visual C++ 프로젝트를,

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
}

최근의 신규 Toolset으로 변경해 빌드하면 이런 오류가 발생합니다.

["Visual Studio 2017 (v141)"인 경우]
fatal error C1083: Cannot open include file: 'corecrt.h': No such file or directory

["Visual Studio 2019 (v142)" 또는 "Visual Studio 2022 (v143)"인 경우]
error C1083: Cannot open include file: 'float.h': No such file or directory

왜냐하면 "Platform Toolset"과 함께 "Windows SDK Version"도 변경해야 하기 때문입니다. 아마도 "v141_xp"인 경우 Windows SDK Version이 "7.0"으로 설정돼 있을 텐데요, 이것을 "10.0 (latest installed version)" 등으로 변경하면 됩니다.




XP용 빌드의 경우, "Windows.h"를 포함하면,

// Visual Studio 2022 + "Visual Studio 2017 - Windows XP (v141_xp)" + "Multi-threaded (/MT)" 설정으로 빌드

#include <iostream>
#include <Windows.h>

int main()
{
    std::cout << "Hello World!\n";
}

이런 컴파일 오류가 발생합니다.

error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'

IUnknown을 사용하는 코드인데요,

extern "C++"
{
    template<typename T> void** IID_PPV_ARGS_Helper(T** pp) 
    {
        static_cast<IUnknown*>(*pp);    // make sure everyone derives from IUnknown
        return reinterpret_cast<void**>(pp);
    }
}

"Conformance mode"를 "No"로 설정하면 됩니다.

objbase.h error when compiling with /permissive- and v141_xp platform toolset
; https://developercommunity.visualstudio.com/t/objbaseh-error-when-compiling-with-permissive-and/174539

혹은, 헤더 파일 포함 전에 typedef로 명시해도 되는데요,

typedef struct IUnknown IUnknown;

#include <iostream>
#include <Windows.h>

그런데 재미있는 건, 저 코드가 어떤 C++ 표준과 관련이 있는 것인지 잘 모르겠습니다. 가령, 저 오류가 발생하는 코드를 유사하게 작성해서 재현해 보려고 했지만,

// Visual Studio 2022 + "Visual Studio 2017 - Windows XP (v141_xp)" + "Multi-threaded (/MT)" 설정으로 빌드

#define DECLSPEC_NOVTABLE_X __declspec(novtable)
#define DECLSPEC_UUID_X(x) __declspec(uuid(x))
#define MIDL_INTERFACE_X(x)   struct DECLSPEC_UUID_X(x) DECLSPEC_NOVTABLE_X
#define EXTERN_C    extern "C"

#ifndef DEFINE_GUID
typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[8];
} GUID;
#endif

typedef GUID IID;

EXTERN_C const IID IID_IUnknown2;
extern "C++"
{
    MIDL_INTERFACE_X("F0FF0FF1-3E61-49FA-AF56-AEA18F4D74B7")
        IUnknown2
    {
    public:
        virtual void Release(void) = 0;
    };
}

MIDL_INTERFACE_X("0AEF294D-14E9-4ED1-BAF0-8609F6B3D157")
Test : public IUnknown2
{
    virtual void Release(void) = 0;
};

template<typename T> void** TEST_Helper(T** pp)
{
    static_cast<IUnknown2*>(*pp);
    return reinterpret_cast<void**>(pp);
}

#define IID_PPV_TEST(ppType) __uuidof(**(ppType)), TEST_Helper(ppType)

int main()
{
    Test* t;

    IID_PPV_TEST(&t);
}

컴파일이 잘됩니다. ^^; 혹시 저 문제의 C++ 표준이 무엇인지 아시는 분은 덧글 부탁드립니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 8/27/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2024-09-03 11시19분
호오 신기하네요 .한번 추적해볼까
JunSeo Lee
2024-09-03 06시53분
호오 기대되네요. ^^
정성태

... 16  17  18  19  20  21  22  23  [24]  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13337정성태5/5/202312850Linux: 59. dockerfile - docker exec로 container에 접속 시 자동으로 실행되는 코드 적용
13336정성태5/4/202312376.NET Framework: 2111. C# - 바이너리 출력 디렉터리와 연관된 csproj 설정
13335정성태4/30/202313285.NET Framework: 2110. C# - FFmpeg.AutoGen 라이브러리를 이용한 기본 프로젝트 구성 - Windows Forms파일 다운로드1
13334정성태4/29/202312284Windows: 250. Win32 C/C++ - Modal 메시지 루프 내에서 SetWindowsHookEx를 이용한 Thread 메시지 처리 방법
13333정성태4/28/202310809Windows: 249. Win32 C/C++ - 대화창 템플릿을 런타임에 코딩해서 사용파일 다운로드1
13332정성태4/27/202311105Windows: 248. Win32 C/C++ - 대화창을 위한 메시지 루프 사용자 정의파일 다운로드1
13331정성태4/27/202310734오류 유형: 856. dockerfile - 구 버전의 .NET Core 이미지 사용 시 apt update 오류
13330정성태4/26/202311289Windows: 247. Win32 C/C++ - CS_GLOBALCLASS 설명
13329정성태4/24/202311477Windows: 246. Win32 C/C++ - 직접 띄운 대화창 템플릿을 위한 Modal 메시지 루프 생성파일 다운로드1
13328정성태4/19/202311304VS.NET IDE: 184. Visual Studio - Fine Code Coverage에서 동작하지 않는 Fake/Shim 테스트
13327정성태4/19/202311509VS.NET IDE: 183. C# - .NET Core/5+ 환경에서 Fakes를 이용한 단위 테스트 방법
13326정성태4/18/202314088.NET Framework: 2109. C# - 닷넷 응용 프로그램에서 SQLite 사용 (System.Data.SQLite) [1]파일 다운로드1
13325정성태4/18/202312241스크립트: 48. 파이썬 - PostgreSQL의 with 문을 사용한 경우 연결 개체 누수
13324정성태4/17/202312487.NET Framework: 2108. C# - Octave의 "save -binary ..."로 생성한 바이너리 파일 분석파일 다운로드1
13323정성태4/16/202312136개발 환경 구성: 677. Octave에서 Excel read/write를 위한 io 패키지 설치
13322정성태4/15/202313671VS.NET IDE: 182. Visual Studio - 32비트로만 빌드된 ActiveX와 작업해야 한다면?
13321정성태4/14/202311582개발 환경 구성: 676. WSL/Linux Octave - Python 스크립트 연동
13320정성태4/13/202311355개발 환경 구성: 675. Windows Octave 8.1.0 - Python 스크립트 연동
13319정성태4/12/202312332개발 환경 구성: 674. WSL 2 환경에서 GNU Octave 설치
13318정성태4/11/202312006개발 환경 구성: 673. JetBrains IDE에서 "Squash Commits..." 메뉴가 비활성화된 경우
13317정성태4/11/202312205오류 유형: 855. WSL 2 Ubuntu 20.04 - error: cannot communicate with server: Post http://localhost/v2/snaps/...
13316정성태4/10/202310684오류 유형: 854. docker-compose 시 "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)" 오류 발생
13315정성태4/10/202311613Windows: 245. Win32 - 시간 만료를 갖는 컨텍스트 메뉴와 윈도우 메시지의 영역별 정의파일 다운로드1
13314정성태4/9/202312475개발 환경 구성: 672. DosBox를 이용한 Turbo C, Windows 3.1 설치 [1]
13313정성태4/9/202311890개발 환경 구성: 671. Hyper-V VM에 Turbo C 2.0 설치 [2]
13312정성태4/8/202311643Windows: 244. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (개선된 버전)파일 다운로드1
... 16  17  18  19  20  21  22  23  [24]  25  26  27  28  29  30  ...