암시 적 링크로 DLL을 연구하기 시작했습니다. 나는 그것이 어떻게 작동하는지 완전히 이해하지 못한다. 내가 틀린 곳에서 나를 교정 해주세요.암시 적 링크 DLL 질문
MyLib.h 지금까지 내가이 DLL의 헤더 인 이해
#ifdef MYLIBAPI
#else
#define MYLIBAPI extern "C" __declspec(dllimport)
#endif
MYLIBAPI int g_nResult;
MYLIBAPI int Add(int nLeft, int nRight);
: 나는 다음 코드 (3 모듈)을 컴파일하는 데 실패했습니다. #define MYLIBAPI extern "C" __declspec(dllimport)
은 여기에 헌신 된 .cpp 파일에 설명되고 DLL에 포함될 일부 함수/변수를 선언한다는 것을 의미합니다.
#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);
}
MyLibFile1.cpp 그래서, 이것은 분명히 우리의 기능이 구현되어있는 파일입니다. 이것은 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을 먼저 컴파일 한 다음 실행 파일을 컴파일하여 (헤더 파일의 경로를 변경) 시도했습니다.
오류 LNK2019 : 그러나 그것은이 오류가 두 번 결과 확인되지 않은 외부 기호 _WinMain을 기능 ___tmainCRTStartup 비주얼 스튜디오 2008 \
프로젝트 \ \ MyExeFile1 \ 디버그 \ MyExeFile1.exe에서 참조 16 @ : 치명적인 오류 LNK1120 : 1 해결되지 않은 외부
올바른 방법은 무엇입니까? 코드에서 무엇을 변경해야하며 VS2008을 사용하여 코드를 컴파일해야합니까? 감사합니다. .
고마워 .. 나는 어떻게되는지 잘 이해하지 못합니다. 선처리기 정의를 추가하면 언제 BUILDING_DLL이 정의되고 언제 정의되지 않습니까? 그 목적은 무엇입니까? 나는 이런 식으로 생각 : DLL이 컴파일되지 않은 동안, BUILDING_DLL 정의되지 않은, 그래서 우리는 DLL에 함수를 가져 오는거야? ... (이제는 dllimport/dllexport 파트를 전혀 이해하지 못한다는 것을 알 수 있습니다) – lhj7362
전 처리기 정의를 추가 할 때 # 정의됩니다. DLL 프로젝트에서 그렇게 했으므로 함수를 내보낼 수 있습니다. 함수가 임포트되는 것을 보장하는 다른 프로젝트에서는 정의되지 않습니다. –