C ++模块定义文件标题内联符号

时间:2015-12-06 02:04:59

标签: c++ dllexport

我在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)它可以正常工作?

1 个答案:

答案 0 :(得分:2)

仅仅因为您使用.def文件而不是__declspec(dllexport)并不意味着rules about exporting inline functions不适用于您。

您无法导出显式inline函数的原因是因为它是内联的,而不是因为您如何导出它。该函数在.dll中没有可以导出的单个定义。因此,.def文件和显式dllexport属性都不能导出它。