我正在使用Visual Studio 2010来构建我的DLL库。
而且,使用Visual Studio 2005的其他程序员想要使用我的DLL库。他可以用我的dll编译,但是,在运行他的应用程序时,它只是崩溃与bad_alloc异常。我认为这是因为CRT版本不同。
在构建我的DLL库时,我尝试了CRT(/ MD)的动态链接和CRT(/ MT)的静态链接,但都失败了。
那么,我不能制作可以被较低版本的visual studio使用的DLL库吗?如果没有,我怎么能这样做?
答案 0 :(得分:3)
据我所知,你必须只使用原始类型的dll接口。这是因为即使在相同的编译器内存布局更改只更改编译标志,请考虑通过更改编译器会发生什么。这可能会导致大规模的不规范行为。
并为您的函数接口使用以下格式:
extern "C" __declspec(dllexport) void doSomething(int input);
答案 1 :(得分:3)
最简单的解决方案:给另一个程序员你的DLL的源代码,让他自己编译DLL对旧的CRT。如果这不合适(因为你不想提供源代码,或者你的DLL不能用VC ++ 2005编译),你必须得到一个VC ++ 2005编译器,或者另一个VC ++ 2010。< / p>
答案 2 :(得分:3)
您只能导出抽象基类(包含至少一个纯虚函数)而没有数据成员以实现二进制兼容性,我想这是关于您的dll原型的问题。这里http://chadaustin.me/cppinterface.html就此问题进行了很好的讨论。
答案 3 :(得分:2)
如果您的机器上安装了VS2005,则可以使用VS2010新的Platform Toolset
功能来使用VS2005编译器。
位于Project Properties
- &gt; General
- &gt; Platform Toolset
下。 VS100是vs2010,VS90是2008年的(我认为)VS80是你需要的(2005年......)。
AFAIK,尝试使用不同的工具集构建的DLL会更难(尽管可能,因为你没有链接它)。
干杯
答案 4 :(得分:1)
最有可能的是,您正在使用在VC ++编译器实现版本之间发生更改的内容(如C ++容器或类型),并且在使用不同VC ++版本构建的DLL之间跨DLL边界传递这些内容可能会失败。
您需要使用该特定编译器(VC ++ 8.0 for VS2005,VC ++ 9.0 for 2008,VC ++ 10.0 for 2010 ...)构建DLL,以便其他程序员使用它。那,或者他必须升级他的Visual Studio以使用与你相同的版本。
答案 5 :(得分:0)
这是一个相当古老的问题,这是COM的原因之一。我建议你做以下事情 -
从名为
的Dll导出2个函数a. GetExportedClass which returns a pointer to a new instance of CExportedClass upcast to IExportedFunctionality*.
b. FreeExportedClass which accepts a IExportedFunctionality* and deletes it.
现在您需要做的就是提供带有IExportedFunctionality声明的头文件。您甚至可以取消lib文件,因为您的用户可以使用LoadLibrary和GetProcAddress来调用GetExportedClass和FreeExportedClass。
注意:IExportedFunctionality应该有