以下是我的方案: 我有一个可执行文件以及多个共享库(.dll或.so)。可执行文件和共享库(.dll或.so)都使用一组公共库。由于它们是公共库我想减少共享库的二进制脚印,为了减少共享库的脚印,我从可执行文件导出公共库的内容并将它们导入共享库(dll或.so) )。
注意:虽然脚印的大小不是唯一有多种原因的,但目前我们仍然坚持这是主要原因。
问题: 在公共库中有一些内联函数和一些模板类。当我使用性能优化标志编译可执行文件和共享库时,内联/模板类在可执行文件和共享库中都有内联。如果修改内联定义并且存在一些具有不同内联函数定义的共享库,则会产生问题。
如何解决这个问题?
当我开始考虑这个时,即使是CRT提供的STL类也是模板类。即使在他们的情况下也存在类似的问题。他们解决了这个问题吗?如果他们修改std :: vector的定义会发生什么?请帮忙。
答案 0 :(得分:1)
类模板是一种创建类的机制。但是,在定义类的特定实例(使用模板参数)之前,这些类不会被实例化。
在导出控制文件中。
#ifdef XXXX_BUILD
#define XXXX_EXPORT __declspec(dllexport)
#define XXXX_EXTERN
#else
#define XXXX_EXPORT __declspec(dllimport)
#define XXXX_EXTERN extern
#endif
其中XXXX_BUILD是项目中定义的符号。
要导出您的课程。
XXXX_EXTERN template class XXXX_EXPORT YourClass<double>;
其中double是要用。实例化类的类型。