我在Visual Studio 2013中使用模块定义文件(.def)来有选择地导出符号以生成导入库。我似乎无法导出标题中完全内联的函数。我不希望使用declspec(dllexport)
因为它使我的应用程序更容易反转,因为每个dllexported函数都有其原始签名。比较:dllexport(左)vs .def文件(右):![1]'。在这种情况下,整个“Obj_AI_Base”类是dllexported。简短:我不希望反向器知道位于(例如)0x123456的函数名为obj_AI_Base :: GetHealth(),但仍然可以访问第三方API。
GameObject.h:
class GameObject
{
inline float Health()
{
return 1000;
}
};
我现在希望导出Health()
方法。
此方法的符号如下所示(从dumbin / exports导出):
?Health@GameObject@Native@MyTool@@QAEMXZ
将其插入我的.def文件:
LIBRARY MyTool
EXPORTS
?Health@GameObject@Native@MyTool@@QAEMXZ @1 NONAME
尽管在头文件中内联了Method,但仍会导致无法解析的外部符号错误。解决方法是将Method主体移动到.cpp文件中。
GameObject.h:
class GameObject
{
float Health();
};
GameObject.cpp:
class GameObject
{
GameObject::Health()
{
return 1000;
}
};
这将导致.def文件按预期工作。由于这个项目有很多属性,其Method主体总是只有1行,这对我来说不是一个解决方案。为什么编译器在标题中定义了Method主体时没有找到符号,但使用__declspec(dllexport)
它可以正常工作?
答案 0 :(得分:2)
仅仅因为您使用.def文件而不是__declspec(dllexport)
并不意味着rules about exporting inline functions不适用于您。
您无法导出显式inline
函数的原因是因为它是内联的,而不是因为您如何导出它。该函数在.dll中没有可以导出的单个定义。因此,.def文件和显式dllexport
属性都不能导出它。