我有一个程序将stl列表传递给dll,当两个模块都处于调试模式时,一切正常。将dll更改为释放模式时,传递不再起作用。我检查了主应用程序中的列表(调试版本)并检查了列表大小为16个字节,立即在我检查的列表中,列表大小现在变为12个字节。并且列表中的所有内容都被错误地解释了。我检查了编译器选项并对结构对齐有疑问,但没有得到任何线索。有谁可以给我一些提示?非常感谢。
传递结构:
class data
{
int
int
char*
double
}
class datalist
{
int
int
int
list<data> list1
list<data> list2
};
传递机制:
fun(const datalist& dl)
*更多说明:
main app (debug) + dll (debug): work fine
main app (release) + dll (release): does not work
main app (debug) +dll (release): does not work
两个模块都使用相同的编译器vs2010 *
进行编译答案 0 :(得分:3)
您的DLL使用的是与您的应用程序不同的C ++标准库版本,因此每个版本都有std::list
自己的(不兼容的)版本。您必须使用(Visual Studio 2010,Release)构建应用程序的相同编译器和配置重建DLL。
答案 1 :(得分:0)
main app (debug) + dll (debug): work fine
main app (release) + dll (release): does not work
main app (debug) +dll (release): does not work
原生DLL是一种非常原始的低级机制。如果应用程序和DLL的编译器具有不同的设置,则任何一方都不知道另一方做出不同的选择。因此,开发人员必须确保所有内容都兼容。
在调试与发布的情况下,差异往往过于显着。所以,不要混合这样的东西。
如果您的发布版本不能协同工作,您应该检查每个项目上的所有编译器/链接器设置,并确保它们是兼容的(这通常意味着它们完全相同)。