c:\program files\microsoft visual studio 9.0\vc\include\result.h(212) : warning C4275: non dll-interface class 'std::_Container_base_aux' used as base for dll-interface class 'std::_Container_base_aux_alloc_real<_Alloc>'
1> with
1> [
1> _Alloc=std::allocator<mysqlpp::Row>
1> ]
1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xutility(377) : see declaration of 'std::_Container_base_aux'
是否可能导致与容器相关的任何问题,或者可以在Visual Studio 2008中安全地忽略它?
答案 0 :(得分:2)
在这种情况下,我认为它取决于std :: runtime_error。对于客户端使用此类,它必须使用客户端提供的定义,而不是DLL端。为此,客户端编译器应该与DLL编译器完全相同。
除了类定义不能跨模块边界移植外,还需要考虑内存所有权。
如果你从一个具有内部变量(如std :: string)的类派生,那么等待发生的灾难就会发生。如果dll将使用与另一个类派生的应用程序不同的运行时,则可能发生以下情况:
当然,这不仅限于字符串。这只是一个例子。任何情况下,1运行时分配一些东西,另一个运行时解除分配它将导致崩溃。
堆内存由基类使用的运行时拥有。派生类的运行时尝试释放它 - &gt;即时崩溃。您将受到dll提供程序的支配,以便为您提供使用相同C ++编译器编译的dll,并使用相同的运行时。这是一场维护噩梦。
DLL类接口毫无疑问是最糟糕的想法。
唯一的两项豁免是:
在所有其他情况下,DLL类接口都支持噩梦,等待发生灾难。
我认为this thread 可能会建议你一个解决方案。
如果使用相同的编译器编译所有内容并使用/MD
,请随意忽略C4275,以便所有模块共享相同的运行时。