我正在尝试为 UE4 项目设置 fmt,但仍然出现编译器错误。
使用的工具链:MSVC .16.27023
fmt lib 是从源代码构建的。
我用谷歌搜索了这个问题和未定义的检查宏。
#undef check
#include <fmt/format.h>
void test()
{
auto test = fmt::format("Number is {}", 42);
}
我尝试了这个定义,但仍然无法编译。
#define FMT_USE_CONSTEXPR 0
#define FMT_HEADER_ONLY
也许有人在虚幻引擎项目中管理过使用fmt库并可以分享一些经验?
在虚幻引擎中集成 {fmt} 库有两个主要问题。
我最终为我的 UE 项目找到了这个解决方案。我定义了自己的标头包装器
MyProjectFmt.h
#pragma once
#define FMT_HEADER_ONLY
#pragma push_macro("check") // memorize current check macro
#undef check // workaround to compile fmt library with UE's global check macros
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4583)
#pragma warning(disable : 4582)
#include "ThirdParty/fmt/Public/fmt/format.h"
#include "ThirdParty/fmt/Public/fmt/xchar.h" // wchar support
#pragma warning(pop)
#else
#include "ThirdParty/fmt/Public/fmt/format.h"
#include "ThirdParty/fmt/Public/fmt/xchar.h" // wchar support
#endif
#pragma pop_macro("check") // restore check macro
然后在你的项目中使用它,如下所示:
SomeActor.cpp
#include "MyProjectFmt.h"
void SomeActor::BeginPlay()
{
std::string TestOne = fmt::format("Number is {}", 42);
std::wstring TestTwo = fmt::format(L"Number is {}", 42);
}
此外,您还可以围绕它创建一些宏包装器,将所有角色放入虚幻引擎的
TEXT()
宏中,甚至可以编写自定义 back_inserter
将角色直接格式化为 FString
。这很容易实现,但这是另一个故事了。