Неразрешенные внешние проблемы при компиляции кода, использующего dll

#c #visual-studio #dll #dynamic-linking

#c #visual-studio #dll #динамическая компоновка

Вопрос:

Я пытаюсь начать использовать 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@@SAHXZ), на который ссылается функция _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 создать оба a .dll и .lib.

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

Комментарии:

1. Есть ли у вас проект TestDll и тестовый проект в одном решении?

2. Да, они находятся в одном решении и используют один и тот же выходной каталог отладки.

3. Когда оба проекта находятся в одном решении, вам не нужно изменять путь к библиотеке. Вы можете установить зависимость проекта, которая выполнит эту работу за вас.

Ответ №1:

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

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

Комментарии:

1. Visual Studio, похоже, не создает testdll.lib при сборке testdll. Есть ли какой-либо способ создать это. библиотека без статической ссылки моего тестового приложения на .lib?

2. Вау! Это некоторый комментарий. итак, вы сказали Visual Studio создать это? Это не создалось даже после того, как вы сказали, что хотите, чтобы кто-то вызывал ваши функции, и что вам не нравятся ошибки ссылок? Я думаю, вы отключили Visual Studio на неделю. Что скажешь, мой друг? Ладно, шутки в сторону, какой проект вы создаете? Проект Win32 DLL? У вас должен быть . библиотека с тем же именем, что и ваша dll в выходном каталоге. Пожалуйста, проверьте там.

3. Тип конфигурации: Динамическая библиотека (.dll) В выходном каталоге создается только .dll, когда я говорю ему скомпилировать .lib (путем изменения конфигурации на «Статическая библиотека») и указать компоновщику test на этот каталог, у меня все та же ошибка неразрешенного символа.

4. @Christopher: Существует разница между созданием статических и динамических библиотек и способами их использования. Можете ли вы рассказать, как вы создали этот проект DLL?

5. Я создал динамическую dll. Вы были правы насчет пути к библиотеке. Это выводило . файл библиотеки в другое место, и как только я подключился к этому месту, тестовый проект правильно подключился и заработал.