我想将我的游戏的某些扩展构建到DLL中,以便我可以重新编译扩展并替换DLL而无需重建整个游戏。我该怎么做呢?
我在某处读到每个新版本的DLL都必须与旧版本“二进制兼容”。只要我不更改函数名称,默认情况下,使用visual studio二进制编译的DLL是否兼容?
答案 0 :(得分:2)
您必须做的不仅仅是保持功能名称相同。您必须确保的是称为应用程序二进制接口或ABI兼容性。
除了符号名称之外,还有很多东西需要它。例如,您可以执行以下操作:保持跨DLL边界传递的数据结构大小相同,并且编译器必须将任何类成员放置在模块中,但在相同的相对位置之外访问它。很多都取决于编译器的ABI。微软编译器有一个不习惯在各个版本上兼容ABI的坏习惯,而其他一些编译器在兼容性方面稍微努力一点。但请记住,它需要的不仅仅是使用相同的编译器。
您可能需要了解如何在您的环境中维护ABI兼容性,因为它可能涉及到比此处列出的更多详细信息,并且有很多方法可以解决。这是one short article就可以了。可能有更好的专门用于MSVC编译器。
答案 1 :(得分:1)
如果从DLL导出类,则在更改编译器版本时会破坏兼容性。为了解决这个问题,请这样做。
创建类接口,如:
class EXPORT_IMPORT_MACROS IMyApi{
public:
virtual void doSomething( IOtherApi* api ) = 0;
virtual void doSomething2( IOtherApi2* api ) = 0;
};
并从您的dll导出它们。它将为您提供一个独立于dll实现的头文件,也可以导出,这意味着它不会对不同版本的运行时库产生任何问题。你也可以看看COM技术。
答案 2 :(得分:1)
一种方法是重新编译DLL。 DLL是兼容的,前提是编译器(Visual Studio)的版本不会更改。否则,您必须检查手册以了解Visual Studio版本之间的兼容性。
另一种方法是使用LoadLibrary function动态加载dll,然后使用GetProcAddress function检索要调用的函数的地址。
如果使用后者,只要export the functions correctly using dllexport使用任何编译器,就可以使用dllimport导入它们。更多详情here。