【发布时间】:2020-05-04 14:18:15
【问题描述】:
在我们的项目中,我们决定在我们的项目中使用最新的 fmt 版本(6.2.0)并主要使用 printf 功能,因为我们在广泛使用 printf 的地方进行了日志记录。
我使用 fmt 包中包含的 CMakeLists.txt 在我们的 Linux 机器上构建了 libfmt.a。
在我的过程中,我包含了 libfmt 包含目录和 target_link_libraries。在代码中我只使用了#include<fmt/printf.h>。现在,当我编译代码时,代码被编译,但在链接时,我得到了错误:还有很多,但以下是第一个,我相信如果这个问题得到解决,其余的将自动解决
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 以显示您的问题。 -
感谢您的评论。我无法在一个小例子中复制这个问题。我试过了。我的项目过程非常复杂,由于此链接错误,二进制文件未构建,我无法确定调用此函数的代码。这就是为什么我在此处发布问题以检查其他人是否也遇到此问题并且可能能够帮助我。