构建.dll为较低版本的visual studio

时间:2011-06-07 05:43:17

标签: c++ visual-studio visual-c++ dll

我正在使用Visual Studio 2010来构建我的DLL库。

而且,使用Visual Studio 2005的其他程序员想要使用我的DLL库。他可以用我的dll编译,但是,在运行他的应用程序时,它只是崩溃与bad_alloc异常。我认为这是因为CRT版本不同。

在构建我的DLL库时,我尝试了CRT(/ MD)的动态链接和CRT(/ MT)的静态链接,但都失败了。

那么,我不能制作可以被较低版本的visual studio使用的DLL库吗?如果没有,我怎么能这样做?

6 个答案:

答案 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的原因之一。我建议你做以下事情 -

  1. 创建一个抽象基类和(又称接口)(比如IExportedFunctionality),它公开当前导出的类(比如说CExportedClass)提供的方法并具有虚拟析构函数。
  2. 不再导出CExportedClass。
  3. 从IExportedFunctionality派生CExportedClass并确保所有方法都已实现。
  4. 从名为

    的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.
    
  5. 现在您需要做的就是提供带有IExportedFunctionality声明的头文件。您甚至可以取消lib文件,因为您的用户可以使用LoadLibrary和GetProcAddress来调用GetExportedClass和FreeExportedClass。

    注意:IExportedFunctionality应该有

    1. 只有纯虚函数 - 因为IExportedFunctionality是一个不实现的接口。
    2. 纯虚析构函数 - 以便在IExportedFunctionality *上执行删除将转换为对CExportedClass的析构函数的调用
    3. IExportedFunctionality中没有任何数据成员(因为user383522指出类的二进制布局可能因编译器和不同的字节对齐而异)