LNK2020在变量静态时

时间:2012-01-31 19:43:29

标签: c++-cli

我使用C ++ / CLI在.NET应用程序和动态加载的C dll之间进行链接。

到目前为止,对DLL的所有访问都是基于实例的。

班级

namespace NxCore {
    public class NativeConnector {

有各种方法引用的变量:

        HMODULE hLib;
        NxCoreProcessTape pfNxProcessTape;
        NxCorePriceToDouble pfNxPriceToDouble;
        NxCoreGetDefinedString pfNxCoreGetDefinedString;
        NxCoreGetSymbolAtom32 pfNxGetSymbolAtom32;
        NxCoreStateGetMMQuotes pfNxStateGetMmQuotes;

我在连接方法中加载它们:

    hLib = ::LoadLibrary("NxCoreAPI.dll");

然后

    pfNxProcessTape = (NxCoreProcessTape)::GetProcAddress(hLib, cszNxCoreProcessTape);
    pfNxPriceToDouble = (NxCorePriceToDouble)::GetProcAddress(hLib, cszNxCorePriceToDouble);
    pfNxCoreGetDefinedString = (NxCoreGetDefinedString)::GetProcAddress(hLib, cszNxCoreGetDefinedString);

现在我需要将其移动到多个实例,所以我想在第一次连接时加载,在最后一次断开时卸载。这意味着变量必须是静态的。

在C#中我会让它们变得静止。我试一试:

    static HMODULE hLib;

并且链接失败:

4> NativeConnector.obj:错误LNK2020:未解析的令牌(0A00006D)“private:static struct HINSTANCE__ * NxCore :: NativeConnector :: hLib”(?hLib @ NativeConnector @ NxCore @ Connectivity @ Tradex @@ 0PAUHINSTANCE __ @@ A)

任何人都知道如何修复它?头文件用于.cpp文件,因此 - 它不应该有不同的定义。

任何人都可以告诉他如何解决这个问题?正如我所说 - 我想将变量移动为静态,然后自己使用“使用计数”来确保我在最后一次断开时释放。

1 个答案:

答案 0 :(得分:1)

从显示的代码中我不清楚是否在ref class(.NET类)或本机C ++类中出现问题。

这是我的建议,假设一个本机类型:你需要定义声明的成员

  • struct X
    {
        static int s_data;
    };
    
  • cpp来源:

    #include "X.h"
    
    int X::s_data /* = 42 */;
    

对于ref类型,我实际上期望静态的语义与C#

相同