我用DLL编写了一个模块化系统(或者.so,它的跨平台)。这些单独的插件必须挂钩到主系统的对象中。
E.G。 在一个对象中有一个字符串向量,所有者是主应用程序。现在有几个(显式加载的)插件必须访问该向量。
这些插件还需要一个基类,一种挂钩到主系统的API。
我尝试将所有头文件都包含在DLL中,但是有两个问题:我每次构建插件时都包含API。 第二个是:对于静态方法,我需要一个cpp文件,但是他并没有使用主应用程序中的cpp文件,而是他自己的。这导致共享向量的问题...(因为现在有多个向量,一个主要,每个插件一个)
有什么想法吗?
答案 0 :(得分:0)
保罗提到这有点问题。当访问在另一个模块(exe / dll)中实例化的向量(可能你正在谈论std :: vector)时,你必须要小心。如果两个模块都使用相同的编译器编译,相同的编译器设置,相同的STL实现,并且您只是从中读取(特别是不推送其他值,因为这可能会重新分配内部缓冲区并在访问内存时导致问题),你应该没事。
但是,如果你不能保证这样的设置,最好提供原始数据数组及其大小的访问,而不是直接通过std :: vector,而是通过std::vector::data()。如果存储的数据类型(std :: vector的模板类型T)在两个通信模块之间是二进制兼容的,那么这样的接口应该是安全的。
有一个C ++标准提案可以解决此类问题:Defining a Portable C++ ABI。希望将来可以防止此类问题。