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++ 표준이 무엇인지 아시는 분은 덧글 부탁드립니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]