模板类与静态数据成员跨DLL/SO使用
template class with static data member used across DLL/SO
假设我有这样一个模板类:
template <class T>
class Queue
{
public:
static int Size;
};
template <class T> int Queue<T>::Size = 0;
和我导出一个函数在d.l ll使用队列作为参数:
void ChangeQueueSize(Queue<int>& q)
{
q.Size = 100;
}
然后我在A.exe中使用这个导出函数:
Queue<int> q;
q.Size = 10;
ChangeQueueSize(q);
int updatedSize = q.Size;
由于Queue类是从2个项目中的类模板生成的,因此实际上有2个代码副本,以及静态数据成员。
调用ChangeQueueSize并不会改变队列大小,它只是更新了另一个类的静态成员,而这个成员恰好有相同的类名。
我们能做什么来解决这个问题?
gcc中的弱符号能够解决这个问题吗?
非常感谢。
您不能按照您想象的方式将模板放入库中。您只能将实际的、实例化的类定义放在库中。
模板本质上是一个代码生成工具,您只能将生成的代码放入库中。
你可能想使用显式模板实例化来使编译器生成代码,并从头文件中取出静态成员定义:
// Header, shipped to clients
template <class T>
class Queue
{
public:
static int Size;
};
// Library source code:
template <typename T> int Queue<T>::size = 0;
template class Queue<int>;
现在将源文件编译到库中;这将包含静态成员变量Queue<int>::size
的实例。
注意,你的消费者将只能使用T = int
类的实例,因为他们不能访问静态成员,否则(即他们必须提供自己的)。
相关文章:
- 挂起和取消挂起一个文件DLL
- N-API include an .so or dll
- 如何在 CMake 超级生成中查找 dll/so 文件
- 无法链接到现有的 libopenblas.so.0 DLL
- 来自Pascal DLL/SO中的C 加载和调用功能
- VS2015 Linking .dll/.so in C++
- 确保.DLL / .so的安全性
- R CMD SHLIB 'undefined reference'并且不为 SWIG 生成的 R 包装器生成 .so/.dll
- 在运行时确定 *.dll 或 *.so 的路径
- C++ 在 Win DLL 到 Linux SO 转换中将 LPBYTE 更改为无符号字符*后编译器错误
- 将C++库转换为 .so / .dll 共享库
- 两个插件链接到具有不同实现(代码)的同名 DLL 或共享库对象 (so)
- 在运行时加载的dll/so中atexit()的行为是什么?
- 在跨dll/so的注入类中使用异常是否安全?
- 如何在单个Windows环境中准备生成.dll和unix .so的构建作业
- DLL / SO库,库内存与调用进程的关系如何?
- 解析来自 dll(so)的C++未定义的引用
- 模板类与静态数据成员跨DLL/SO使用
- CMake:如何确定所有.DLL/.需要可执行文件的 SO 文件
- MPI and DLL(SO) functions