неявное связывание DLL вопрос - PullRequest
1 голос
/ 16 января 2010

Я начал изучать библиотеки DLL с неявными ссылками. Я не совсем понимаю, как это работает. Пожалуйста, поправьте меня, где я не прав. Мне не удалось скомпилировать следующий код (3 модуля):

MyLib.h

#ifdef MYLIBAPI

#else


#define MYLIBAPI extern "C" __declspec(dllimport)

#endif


MYLIBAPI int g_nResult;

MYLIBAPI int Add(int nLeft, int nRight);

Насколько я понимаю, это заголовок DLL. #define MYLIBAPI extern "C" __declspec(dllimport) означает, что здесь мы собираемся объявить некоторые функции / переменные, которые будут описаны в выделенном файле .cpp и будут содержаться в DLL.

MyLibFile1.cpp

#include <windows.h>

#define MYLIBAPI extern "C" __declspec(dllexport)

#include "MyLib.h"

int g_nResult; 
int Add(int nLeft, int nRight) {
   g_nResult = nLeft + nRight;
   return(g_nResult);
}

Итак, это, очевидно, файл, в котором реализованы наши функции. Это часть DLL, верно?

MyExeFile1.cpp

#include <windows.h>
#include <strsafe.h>
#include <stdlib.h>

#include "MyLib.h"

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) {

   int nLeft = 10, nRight = 25;

   TCHAR sz[100];
   StringCchPrintf(sz, _countof(sz), TEXT("%d + %d = %d"),
      nLeft, nRight, Add(nLeft, nRight));
   MessageBox(NULL, sz, TEXT("Calculation"), MB_OK);

   StringCchPrintf(sz, _countof(sz),
      TEXT("The result from the last Add is: %d"), g_nResult);
   MessageBox(NULL, sz, TEXT("Last Result"), MB_OK);
   return(0);
}

Итак, это исполняемый файл, в котором мы используем функции из библиотеки. Все это не работает. Я попытался поместить все это в один каталог и скомпилировать сразу. Я попытался сначала скомпилировать DLL из первых двух модулей (успешно), а затем скомпилировать исполняемый файл (изменив путь к файлу заголовка). Однако это привело к 2 ошибкам оба раза:

ошибка LNK2019: неразрешенный внешний символ _WinMain @ 16, указанный в функции ___ tmainCRTStartup

\ Visual Studio 2008 \ Projects \ MyExeFile1 \ Debug \ MyExeFile1.exe: фатальная ошибка LNK1120: 1 неразрешенный внешний код

Как правильно это сделать - что я должен изменить в коде и как мне скомпилировать код (я использую VS2008)? Спасибо.

Ответы [ 3 ]

1 голос
/ 16 января 2010

#include <tchar.h> для устранения ошибки компоновщика.

Ваш заголовочный файл должен выглядеть так:

#ifdef BUILDING_DLL
#  define MYLIBAPI extern "C" __declspec(dllexport)
#else
#  define MYLIBAPI extern "C" __declspec(dllimport)
#endif

MYLIBAPI int __stdcall Add(int nLeft, int nRight);

Щелкните правой кнопкой мыши свой проект DLL в обозревателе решений, свойствах, C / C ++, препроцессоре, определениях препроцессора, добавьте «BUILDING_DLL». Повторите для конфигурации выпуска.

Вы можете убедиться, что ваша DLL правильно экспортирует функции с помощью Dumpbin.exe /exports.

Объявление __declspec (dllimport) не является строго необходимым, однако оно делает его более эффективным. Атрибут __stdcall также не является необходимым, однако он делает вашу DLL пригодной для использования на любом языке, который поддерживает вызов экспорта DLL.

0 голосов
/ 16 января 2010

Это даже компилируется? Разве вы не должны #include <tchar.h>, чтобы все типы и определения TCHAR работали?

0 голосов
/ 16 января 2010

Измените _tWinMain на WinMain в MyExeFile1.cpp. Он ищет вашу точку входа с именем WinMain, а не _tWinMain, поэтому компоновщик жалуется, что не может найти WinMain.

Существуют настройки проекта, которые определяют, каким именем должна быть функция точки входа, но я не уверен, какое из них потребует _tWinMain.

Редактировать Согласно этой публикации _tWinMain - это определение, которое отображается на WinMain, если вы включите tchar.h. текст ссылки

...