c++ 为什么fmt::make_format_args在使用homebrew安装的libfmt时可以工作,但在链接到我构建的版本时不工作?

js81xvg6  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(189)

我目前正在使用C++的libfmt,我得到了一个我认为不应该得到的错误。这段代码有时候可以工作,但有时候不行。
当我从自制软件的安装位置(我在MacOS上)链接libfmt时,它完全工作。当我使用cd $(PATH_FMT) && mkdir -p build && cd build && cmake .. && make从我构建的静态链接时。然后连接到LDFLAGS += $(PATH_FMT)/build/libfmt.a。两者之间的区别在于是否在我的makefile中注解掉以下行:CCFLAGS += -I/opt/homebrew/include,代码如下:

#define FMT_HEADER_ONLY
#include <fmt/core.h>
#include <fmt/format.h>

.
.
.

template<typename... Ts> static inline std::string format(const std::string &s, Ts &&...ts) {
    return fmt::vformat(std::string_view(s), fmt::make_format_args(ts...));
}

同样,只有当我使用我构建的版本而不是Homebrew提供的版本时,才会发生错误。错误如下:

src/util/log.cpp:13:43: error: no matching function for call to 'make_format_args'
                                          fmt::make_format_args(level_name, f, line, func, msg,
                                          ^~~~~~~~~~~~~~~~~~~~~
lib/fmt/include/fmt/core.h:1804:16: note: candidate function [with Context = fmt::basic_format_context<fmt::appender, char>, T = <const std::string, std::string, unsigned long, const std::string, const std::string, const char *>] not viable: expects an lvalue for 6th argument
constexpr auto make_format_args(T&... args)

我理解错误与此问题有关:candidate function not viable: expects an l-value for 3rd argument,但在这个上下文中对我没有意义。这也没有意义,因为libfmt API将其作为示例显示:参数列表。在这个例子中,他们正在做和我一样的事情。
当我自己构建它时会有错误,而当我使用brew安装的版本时却没有,这对我来说没有意义。即使我做的事情看起来和API中的示例一样,我也不会得到一个错误。Homebrew版本和手动构建的版本都是10.0.0。有人知道可能出了什么问题吗?

li9yvcax

li9yvcax1#

这个错误提示你传递了一个右值作为第六个参数(在错误消息中被截断了)。您根本不需要fmt::vformatfmt::make_format_args,应该使用fmt::format并将格式字符串 Package 在fmt::runtime中,以将格式字符串标记为仅在运行时已知:

return fmt::format(fmt::runtime(format_str),
                   level_name, f, line, func, msg, /* 6th argument */);

这将修复错误并使意图清晰。

相关问题