Неразрешенные внешние проблемы при компиляции кода, который использует DLL - PullRequest
0 голосов
/ 26 апреля 2011

Я пытаюсь начать использовать dll для моего кода в VS 2005. Код, который я имею, очень прост, просто чтобы попробовать контрольный пример.

testdll.h:

#ifdef TEST_EXPORTS
#define TESTDLLPORT   __declspec( dllexport )
#else
#define TESTDLLPORT   __declspec( dllimport )
#endif

namespace TestDLLNS
{
    static int s = 0;
    class MyTestDll {
    public:
        static TESTDLLPORT int printDLLFuncs();
    };
}

testdll.cpp:

// testdll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "testdll.h"

#ifdef _MANAGED
#pragma managed(push, off)
#endif

namespace TestDLLNS {
    int MyTestDll::printDLLFuncs() {
        cout << "DLL function called" << endl;
        return s;
    }
}
#ifdef _MANAGED
#pragma managed(pop)
#endif

test.cpp:

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "testdll.h"

int main(int argc, char* argv[])
{
    cout << "int: " << TestDLLNS::MyTestDll::printDLLFuncs() << endl;
    cout << "Called dll" << endl;
    return 0;
}

Ошибка 1, ошибка LNK2019: неразрешенный внешний символ "__declspec (dllimport) public: static int _ cdecl TestDLLNS :: MyTestDll :: printDLLFuncs (void)" ( _imp_? PrintDLLFuncs @ MyTestDll @ TestDLLNS @@ SAH ) упоминается в функции _main test.obj

dumpbin \ exports testdllD.dll выдает следующее: порядковый номер RVA name

      1    0 0001105F ?printDLLFuncs@MyTestDll@TestDLLNS@@SAHXZ

Таким образом, символ явно существует в .dll. Должна ли Visual Studio также создавать файлы testdllD.lib, которые я должен связать с test.cpp? Если так, то как я получаю Visual Studio, чтобы сделать .dll и .lib.

Редактировать: я правильно делаю импорт / экспорт? Из того, что я понимаю, при компиляции dll вы захотите использовать dllexport, а при компиляции исполняемого файла, использующего dll, будет использоваться dllimport.

1 Ответ

0 голосов
/ 26 апреля 2011

Есть несколько вещей, на которые стоит обратить внимание, и я надеюсь, что вы их не пропустили.

  1. То, что у вас есть ошибка компоновки, означает, что ваша компиляция прошла нормально, но есть ошибка компоновки. Ошибка показывает, что при связывании не найдено определение для функции printDLLFuncs (), на которую есть ссылка в объектном файле.
  2. Необходимо либо указать путь к файлу .lib, в котором функция определена в «Каталогах проектов» -> «Путь к библиотеке», либо поместить его в любую из папок проекта, чтобы ваша Visual Studio могла его найти.
...