如何为虚幻引擎项目设置{fmt}库?

问题描述 投票:0回答:1

我正在尝试为 UE4 项目设置 fmt,但仍然出现编译器错误。

使用的工具链:MSVC .16.27023

fmt lib 是从源代码构建的。

我用谷歌搜索了这个问题和未定义的检查宏。

#undef check
#include <fmt/format.h>

void test()
{
    auto test = fmt::format("Number is {}", 42);
}

出现编译器错误: enter image description here

我尝试了这个定义,但仍然无法编译。

#define FMT_USE_CONSTEXPR 0
#define FMT_HEADER_ONLY

也许有人在虚幻引擎项目中管理过使用fmt库并可以分享一些经验?

c++ unreal-engine4 fmt
1个回答
1
投票

在虚幻引擎中集成 {fmt} 库有两个主要问题。

  1. 检查宏的全局定义。 fmt 实现中的一些变量/函数名为“check”。所以有冲突。
  2. 默认启用错误警告。因此,您要么禁用此功能,要么抑制特定警告。

我最终为我的 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
。这很容易实现,但这是另一个故事了。

© www.soinside.com 2019 - 2024. All rights reserved.