我在生成的可执行文件中链接了两个静态库。它们都相同地定义了类模板 fmt::formatter
<shatred_ptr<T>,char>
格式化模板shared_ptr<T>
(用于记录目的)。每个库中的定义都是相同的,look like this :
#include<fmt/ostream.h>
template <typename T> struct fmt::formatter<std::shared_ptr<T>,char>: ostream_formatter {};
该模板针对许多不同的 T
隐式实例化s。
当链接可执行文件时,我收到关于多个定义的提示
error: redefinition of ‘struct fmt::v9::formatter<std::shared_ptr<_Tp>, char>’
有没有办法告诉编译器合并 token 到 token 相同的定义?我尝试了各种方法,例如输入 inline
, extern
, __attribute__((visibility,"hidden"))
到各个地方;使用“对象”库(CMake 称之为 - 我认为它只是对象存档)而不是静态库和其他库。
我将感谢对这个(又一个)c++ 角落的解释;以及微创解决方案。
最佳答案
感谢 @DavisHerring 注意到错误是编译时的,而不是链接时的(之前有一些半相关的链接错误,我没有再次仔细检查这种情况)。因此,我可以通过宏保护两个相同的定义,例如此处,修复了主程序中包含两个库的 header 的情况。
#include<fmt/ostream.h>
#ifndef FMT_EIGEN_SHARED_PTR_FORMATTER
#define FMT_EIGEN_SHARED_PTR_FORMATTER
template <typename T> struct fmt::formatter<std::shared_ptr<T>,char>: ostream_formatter {};
#endif
关于c++ - 隐式类实例化翻译单元 : multiple definition when linking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73757587/