在我们的项目中,我们决定在项目中使用最新的 fmt 版本(6.2.0),并主要使用 printf 功能,因为我们广泛使用 printf 进行日志记录。
我使用 fmt 包中包含的 CMakeLists.txt 在 Linux 机器上构建了 libfmt.a。在我的过程中,我将 libfmt include 目录包含在 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:: locale_ref)'
我做了一些分析,发现这个函数的定义存在于format-inl.h中。我尝试将其包含在我的代码中,但仍然存在相同的链接问题。
现在,当我在代码中定义宏FMT_HEADER_ONLY时,链接起作用了。
我的问题是:当我链接库 libfmt.a 时,它无法找到该函数。为什么?我不想使用仅标题版本。
请让我知道如何解决这个问题。
链接顺序很重要(请参阅/sf/answers/28662931/)。确保在使用该库的源文件或目标文件之后传递该库。例如:
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
Run Code Online (Sandbox Code Playgroud)
此示例从 github 获取 {fmt},对其进行编译,创建一个小型测试源,编译并运行它,并给出以下输出:
Hello, world!
Run Code Online (Sandbox Code Playgroud)
如果您-lfmt之前通过test.cc,则会出现链接错误。
我建议使用 CMake,它将为您处理链接顺序:https://fmt.dev/latest/usage.html#usage-with-cmake
| 归档时间: |
|
| 查看次数: |
4612 次 |
| 最近记录: |