假人的 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
,所以它们被忽略了。将库放在源代码之后时,会在库中搜索代码中缺少的符号。
(如果出现循环依赖,你甚至可能需要多次提供一个库)
我想用 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
,所以它们被忽略了。将库放在源代码之后时,会在库中搜索代码中缺少的符号。
(如果出现循环依赖,你甚至可能需要多次提供一个库)