c++ - 隐式类实例化翻译单元 : multiple definition when linking

标签 c++ templates linkage class-template

我在生成的可执行文件中链接了两个静态库。它们都相同地定义了类模板 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/

相关文章:

c++ - CONFIG += c++11(仍然)在 Linux 上不起作用

c++ - 用说明符extern声明的C++中的标识符链接

c++ - 解释一下C++中的链接(外部/内部)?

c++ - 在可变数量的标记碱基上进行模板化

C++:运算符和模板

c++ - 变量可以同时声明为静态和外部吗?

c++ - 嵌套类构造函数调用私有(private)构造函数,它可以工作吗?

C++ DLL 注入(inject) : path with special characters

c++ - OpenGL:在处理纹理时至少绑定(bind)一个纹理?

templates - Eigen 中 PlainObjectBase 和 DenseBase 的区别