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분
호오 기대되네요. ^^
정성태

... 76  77  78  79  80  [81]  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
11911정성태5/23/201917478VS.NET IDE: 136. Visual Studio 2019 - 리눅스 C/C++ 프로젝트에 인텔리센스가 동작하지 않는 경우
11910정성태5/23/201927119Math: 50. C# - MathNet.Numerics의 Matrix(행렬) 연산 [1]파일 다운로드1
11909정성태5/22/201921146.NET Framework: 837. C# - PLplot 사용 예제 [1]파일 다운로드1
11908정성태5/22/201919896.NET Framework: 836. C# - Python range 함수 구현파일 다운로드1
11907정성태5/22/201916611오류 유형: 541. msbuild - MSB4024 The imported project file "...targets" could not be loaded
11906정성태5/21/201916850.NET Framework: 835. .NET Core/C# - 리눅스 syslog에 로그 남기는 방법
11905정성태5/21/201917380.NET Framework: 834. C# - 폴더 경로 문자열에서 "..", "." 표기를 고려한 최종 문자열을 얻는 방법 - 두 번째 이야기
11904정성태5/21/201925773.NET Framework: 833. C# - Open Hardware Monitor를 이용한 CPU 온도 정보 [1]파일 다운로드1
11903정성태5/21/201919593오류 유형: 540. .NET Core - System.PlatformNotSupportedException: The named version of this synchronization primitive is not supported on this platform.
11902정성태5/21/201917753오류 유형: 539. mstest 실행 시 "The directory name is invalid." 오류 발생
11901정성태5/21/201919653오류 유형: 538. msbuild 오류 - Could not find a part of the path '%LOCALAPPDATA%\Temp\2\.NETFramework,Version=v4.0.AssemblyAttributes.cs'
11900정성태5/18/201918612오류 유형: 537. "sfc /scannow" 실행 중 시스템이 부팅되는 현상
11899정성태5/17/201919443Linux: 9. Linux에서 윈도우의 OutputDebugString 대신 사용할 수 있는 syslog [1]
11898정성태5/16/201921254VC++: 130. C++ string의 c_str과 data 함수의 차이점 [3]
11897정성태5/16/201928225오류 유형: 536. Visual Studio - "Developer Pack"을 설치했는데도 "대상 프레임워크" 목록에 나오지 않는 경우 [2]
11896정성태5/15/201923146개발 환경 구성: 440. C#, C++ - double의 Infinity, NaN 표현 방식파일 다운로드1
11895정성태5/12/201921001.NET Framework: 832. ML.NET Model Builder - 회귀(Regression), 다중 분류(Multi-class classification) 예제파일 다운로드1
11894정성태5/10/201922712VS.NET IDE: 135. Visual Studio - ML.NET Model Builder 소개 [5]
11893정성태5/10/201919634오류 유형: 535. C# 6.0 이상의 문법을 컴파일 시 오류가 발생한다면?
11892정성태5/10/201919476웹: 38. HTTP Cookie의 expires 시간 형식(RFC7231)
11891정성태5/9/201922545.NET Framework: 831. (번역글) .NET Internals Cookbook Part 12 - Memory structure, attributes, handles
11890정성태5/8/201917665개발 환경 구성: 439. "Visual Studio Enterprise is required to execute the test." 메시지와 관련된 코드 기록
11889정성태5/8/201918339개발 환경 구성: 438. mstest, QTAgent의 로그 파일 설정 방법
11888정성태5/8/201935708.NET Framework: 830. C# - 비동기 호출을 취소하는 CancellationToken의 간단한 예제 코드 [1]파일 다운로드1
11887정성태5/8/201921321.NET Framework: 829. C# - yield 문을 사용할 수 있는 메서드의 조건
11886정성태5/7/201919161오류 유형: 534. mstest.exe 실행 시 "Visual Studio Enterprise is required to execute the test." 오류 [2]
... 76  77  78  79  80  [81]  82  83  84  85  86  87  88  89  90  ...