【问题标题】:problem with including fmt library in several cpp files在多个 cpp 文件中包含 fmt 库的问题
【发布时间】:2021-08-25 11:23:47
【问题描述】:

美好的一天!
我在 Ubuntu 中安装了 fmt 库。在我的项目中添加了它

#include "fmt/core.h"
#include "fmt/format.h"
#include "fmt/format-inl.h"

使用fmt::format_int и fmt::format。我在项目的几个 cpp 文件中添加了库头文件。在链接过程中出现“多重定义”错误:

obj/container.o:在函数fmt::v7::format_error::~format_error()': container.cpp:(.text+0x40e): multiple definition of fmt::v7::format_error::~format_error()' obj/line.o:line.cpp:(.text+0x40e): 首先定义在这里

我读过一些关于这个错误的文章。建议在 h 和 cpp 文件中划分声明和实现,为导致错误的对象设置一些状态等。但是所有这些建议都意味着编辑库(不是我的!)代码!
怎么了?

我执行以下操作
文件汇编 - 一个一个
g++ -std=c++11 -Wall -o obj/line.o -c /home/...//line.cpp
g++ -std=c++11 -Wall -o obj/container.o -c /home/...//container.cpp
g++ -std=c++11 -Wall -o obj/geometryObject.o -c /...//geometryObject.cpp
g++ -std=c++11 -Wall -o obj/model.o -c /home/...//model.cpp
g++ -std=c++11 -Wall -o obj/point.o -c /home/...//point.cpp
g++ -std=c++11 -Wall -o obj/main.o -c /home/...//main.cpp
链接 - 此处出错
g++ -std=c++11 -Wall -o myapp obj/line.o obj/container.o obj/geometryObject.o obj/model.o obj/point.o obj/main.o

【问题讨论】:

  • 链接代码的情况如何,或者你的构建系统如何?
  • 不要包含“fmt/core.h”和“fmt/format-inl.h”,只包含fmt/format.h,会包含其他两个。
  • g++ -std=c++11 -Wall -o myapp obj/line.o obj/container.o obj/geometryObject.o obj/model.o obj/point.o obj/main. o
  • 我删除了format-inl.h和core.h。但是很多错误是“多重定义”,其中包括“未定义的引用”。这似乎是同样的事情。没有任何意义。在官方推荐中,据说包括所有 h 文件 (fmt.dev/latest/usage.html)。但我认为你是 100% 正确的。至少关于 core.h。
  • 你使用的是什么版本的 fmt 库?您安装的 Ubuntu 中的那个,还是您自己安装的那个?

标签: c++ fmt


【解决方案1】:

您不应该包含fmt/format-inl.h,因为它是一个内部标头。请参阅documentation 了解公共标头列表及其提供的内容。

【讨论】:

  • 嘿伙计们,我很抱歉我的愚蠢问题和我对正确答案的不专心反应!我听从了您的建议,“多重定义”消失了。谢谢你。但我又犯了一个错误——“未定义的引用”。我找到了解决方案here。我不是专业程序员;你能给我一个提示:为什么#define FMT_HEADER_ONLY 应该放在#include "fmt/format.h" 之上? FMT_HEADER_ONLY 需要什么?等等。我只是了解这些事情的一般规则——它们是如何工作的。
  • @AlexanderVachenko “未定义对 what 的引用?”这是重要的部分。此外,您很可能使用FMT_HEADER_ONLY,以免阅读官方文档时说应该使用。
  • @AlexanderVachenko 如果您查看fmt/format.h 标头的底部,您会看到如果定义了FMT_HEADER_ONLY,那么FMT_FUNC 被定义为内联,然后fmt/format-inl.h 是包括。看起来像将FMT_FUNC 定义为内联会导致fmt/format-inl.h 中的函数被内联——这避免了“多重定义”问题。
  • 确保链接 fmt 库(Linux 上的 libfmt.a)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2018-09-15
  • 2020-07-05
  • 2012-05-23
  • 1970-01-01
相关资源
最近更新 更多