使用 fmt 链接错误:未定义对 `std::string fmt::v6::internal::grouping_impl<char>(fmt::v6::internal::locale

Posted

技术标签:

【中文标题】使用 fmt 链接错误:未定义对 `std::string fmt::v6::internal::grouping_impl<char>(fmt::v6::internal::locale_ref)\' 的引用【英文标题】:Linking errors with fmt: undefined reference to `std::string fmt::v6::internal::grouping_impl<char>(fmt::v6::internal::locale_ref)'使用 fmt 链接错误:未定义对 `std::string fmt::v6::internal::grouping_impl<char>(fmt::v6::internal::locale_ref)' 的引用 【发布时间】:2020-05-04 14:18:15 【问题描述】:

在我们的项目中,我们决定在我们的项目中使用最新的 fmt 版本(6.2.0)并主要使用 printf 功能,因为我们在广泛使用 printf 的地方进行了日志记录。

我使用 fmt 包中包含的 CMakeLists.txt 在我们的 Linux 机器上构建了 libfmt.a。 在我的过程中,我包含了 libfmt 包含目录和 target_link_libraries。在代码中我只使用了#include&lt;fmt/printf.h&gt;。现在,当我编译代码时,代码被编译,但在链接时,我得到了错误:还有很多,但以下是第一个,我相信如果这个问题得到解决,其余的将自动解决

abc.cpp:(.text._ZN3fmt2V68internal8groupingIcEESsNS1_10locale_refE[_ZN3fmt2v68internal8groupingIcEESsNS1_10locale_refE]+0X20): 未定义的对`std::string fmt::v6::internal::grouping_impl(fmt::v6::internal:::::

我做了一些分析,发现这个函数的定义存在于format-inl.h中。我尝试将它包含在我的代码中,但仍然存在相同的链接问题。

现在,当我在代码中定义宏 FMT_HEADER_ONLY 时,链接起作用了。

我的问题是:当我与库 libfmt.a 链接时,它无法找到该函数。为什么? 我不想使用只有标题的版本。

请告诉我如何解决这个问题。

【问题讨论】:

你如何构建你的程序?您要链接哪些库?请为您的CMakeLists.txt 和edit 创建一个minimal reproducible example 以显示您的问题。 感谢您的评论。我无法在一个小例子中复制这个问题。我试过了。我的项目过程非常复杂,由于此链接错误,二进制文件未构建,我无法确定调用此函数的代码。这就是为什么我在此处发布问题以检查其他人是否也遇到此问题并且可能能够帮助我。 【参考方案1】:

链接顺序很重要(请参阅https://***.com/a/409470/471164)。确保在使用它的源文件或目标文件之后传递库。例如:

git clone https://github.com/fmtlib/fmt.git
cd fmt
make fmt
cat <<EOF > test.cc
#include <fmt/printf.h>

int main() 
  fmt::printf("Hello, %s!", "world");

EOF
g++ test.cc -L. -lfmt -Iinclude
./a.out

此示例从 github 获取 fmt,对其进行编译、创建和一个小型测试源、编译并运行它并给出以下输出:

Hello, world!

如果您在test.cc 之前传递-lfmt,则会出现链接错误。

我建议使用 CMake,它会为您处理链接顺序:https://fmt.dev/latest/usage.html#usage-with-cmake

【讨论】:

感谢您提供宝贵意见。我忘了提,我们只在我们的项目中使用 cmake。我还认为 cmake 会自动处理链接。不过,让我尝试重新调整链接,看看是否能解决问题。 确保添加target_link_libraries(yourtarget fmt) 是的,我这样做了,但这并没有解决问题。如果我在仅标头模式下使用 fmt,则编译工作。但是当我与 libfmt.a 链接时出现链接错误 我改组了链接,但仍然无法正常工作。请进一步咨询。

以上是关于使用 fmt 链接错误:未定义对 `std::string fmt::v6::internal::grouping_impl<char>(fmt::v6::internal::locale的主要内容,如果未能解决你的问题,请参考以下文章

未定义对“cudaRegisterLinkedBinary”的引用-CMake 中的链接错误?

链接错误:Armadillo 库中的“未定义对‘pthread_atfork’的引用”

未定义对向量<String> g++ 链接器错误的引用[重复]

链接器错误:未定义对符号“glOrtho”的引用

链接器错误:未定义对“QGLViewer 的 vtable”的引用

STM32 GNU ARM 链接器:使用 eclipse 对函数()的未定义引用