【发布时间】: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 offmt::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 中的那个,还是您自己安装的那个?