假人的 fmt 链接

fmt linking for dummies

我想用 C++ 创建一个 python-like 动态整数 class 作为实验。它要求我将许多整数更改为字符串类型。如此处所示:https://www.zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html 它指出 fmt format_int 最适合那种工作。

所以我用命令安装了 fmt sudo apt-get install libfmt-dev

我加了一个header#include <fmt/format.h>

在一个简单的测试 main 中使用它

int main()
{
    std::cout<<fmt::format_int(124236695253045068).str();
}

并尝试使用 g++ -lfmt -std=c++17 dynamic\ mem.cc

进行编译

编译器输出如下:

/usr/bin/ld: /tmp/ccLBcSNm.o: in function `fmt::v6::format_int::format_decimal(unsigned long long)':
dynamic mem.cc:(.text._ZN3fmt2v610format_int14format_decimalEy[_ZN3fmt2v610format_int14format_decimalEy]+0x94): undefined reference to `fmt::v6::internal::basic_data<void>::digits'
/usr/bin/ld: dynamic mem.cc:(.text._ZN3fmt2v610format_int14format_decimalEy[_ZN3fmt2v610format_int14format_decimalEy]+0xad): undefined reference to `fmt::v6::internal::basic_data<void>::digits'
/usr/bin/ld: dynamic mem.cc:(.text._ZN3fmt2v610format_int14format_decimalEy[_ZN3fmt2v610format_int14format_decimalEy]+0xfa): undefined reference to `fmt::v6::internal::basic_data<void>::digits'
/usr/bin/ld: dynamic mem.cc:(.text._ZN3fmt2v610format_int14format_decimalEy[_ZN3fmt2v610format_int14format_decimalEy]+0x113): undefined reference to `fmt::v6::internal::basic_data<void>::digits'
/usr/bin/ld: /tmp/ccLBcSNm.o: in function `std::make_unsigned<long>::type fmt::v6::internal::to_unsigned<long>(long)':
dynamic mem.cc:(.text._ZN3fmt2v68internal11to_unsignedIlEENSt13make_unsignedIT_E4typeES4_[_ZN3fmt2v68internal11to_unsignedIlEENSt13make_unsignedIT_E4typeES4_]+0x2b): undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'
collect2: error: ld returned 1 exit status

你知道哪里出了问题吗?我通常 link non-standard 图书馆所以我不知道该怎么做。

使用

$ g++ -std=c++17 dynamic\ mem.cc -lfmt

fmt 作为静态库提供 (.a)。对于这些,顺序很重要,因为链接器仅从库中取出需要为命令行中位于它们之前的其他对象或库提供符号的对象。如果你从一个库开始,只有 main 是缺失的,而且通常库不提供 main,所以它们被忽略了。将库放在源代码之后时,会在库中搜索代码中缺少的符号。

(如果出现循环依赖,你甚至可能需要多次提供一个库)