5

我正在尝试在我的 c++ 项目中使用 fmt ( https://github.com/fmtlib/fmt ) 格式头库。

我在主文件顶部添加了核心头文件的路径,如下所示:

#include "../third_party/fmt/core.h"

但是当我尝试调用任何函数时:

string message = fmt::format("The answer is {}", 42);

我收到以下错误:

Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > fmt::v5::internal::vformat<char>(fmt::v5::basic_string_view<char>, fmt::v5::basic_format_args<fmt::v5::buffer_context<char>::type>)", referenced from:
      std::__1::basic_string<std::__1::enable_if<internal::is_string<char [17]>::value, fmt::v5::internal::char_t<char [17]>::type>::type, std::__1::char_traits<std::__1::enable_if<internal::is_string<char [17]>::value, fmt::v5::internal::char_t<char [17]>::type>::type>, std::__1::allocator<std::__1::enable_if<internal::is_string<char [17]>::value, fmt::v5::internal::char_t<char [17]>::type>::type> > fmt::v5::format<char [17], int>(char const (&) [17], int const&) in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [main] Error 1
make[1]: *** [CMakeFiles/main.dir/all] Error 2
make: *** [all] Error 2

我不确定如何使用它,因为这是我过去使用其他头库(例如 cxxopts)的方式。任何帮助,将不胜感激!

4

3 回答 3

3

您应该与fmt库链接或使用可选的仅标头模式

例如,如果您有文件test.cc

#include <fmt/core.h>

int main() {
  fmt::print("The answer is {}.", 42);
}

你可以用 gcc 编译和链接它:

g++ -std=c++11 test.cc -lfmt
于 2019-06-23T14:41:09.493 回答
1

我正在使用 Mac,但我没有意识到您可以使用brew. 它出现在页面的末尾。我整个晚上都在处理符号错误,我不确定我的所有问题都与构建过程有关。编译过程也无法正常工作。

安装库的路径是:/usr/local/include/usr/local/lib

g++-11用来构建我的项目,这个指令对我有用:

g++-11 -std=c++20 -I/usr/local/include -L/usr/local/lib -lfmt main.cpp -o main

唯一的问题是它只能部分工作。它适用于print

fmt::print("Don't {}!\n", "panic");

但它打破了使用format

fmt::format("Don't {}!\n", "panic");

我错过了一些东西,但我不确定是什么。

顺便说一句,如果您使用的是 VSCode,您可以c_cpp_properties.json在您的.vscode文件夹中创建一个并添加标题的包含路径。

{
  "includePath": [
    [...],
    "/usr/local/include/"
  ],
}

不确定这是否与您的情况有关,但我希望它有所帮助。

于 2021-09-25T21:01:14.213 回答
0

@vitaut's answer中的评论中,如果您#include从这里更改您的行:

#include "../third_party/fmt/core.h"

对此:

#include "../third_party/fmt/format.h"

它将导致代码以“仅标头模式”编译,您无需更改构建过程即可在 {fmt} 库中进行编译和链接。

于 2021-06-02T10:47:10.717 回答