LNK2020 при создании переменной статической - PullRequest
1 голос
/ 31 января 2012

Я использую 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: статическая структура HINSTANCE__ * NxCore :: NativeConnector ::hLib "(? hLib @ NativeConnector @ NxCore @ Connectivity @ Tradex @@ 0PAUHINSTANCE __ @@ A)

Кто-нибудь знает, как это исправить?Заголовочный файл используется в файле .cpp, поэтому он не должен иметь других определений.

Кто-нибудь может сказать, как решить эту проблему?Как я уже сказал, я хочу переместить переменные в статические, а затем сам использовать «подсчет использования», чтобы убедиться, что я освобождаю при последнем отключении.

1 Ответ

1 голос
/ 01 февраля 2012

Из показанного кода мне не совсем ясно, возникает ли проблема в классе ref (.NET-классе) или в нативном классе C ++.

Вот мой совет, предполагая нативный тип: Вам нужноопределить объявленный элемент

  • header

    struct X
    {
        static int s_data;
    };
    
  • cpp source:

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

Для типов ссылок я бы на самом деле ожидал ту же семантику для статического, что и в C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...