2009-10-14 8 views
0

이 (명확성을 위해 재 작성)LNK2019은 DLL을

내가 .dll 파일 lib 디렉토리 사용하여 변환 찾고 있어요 다중 프로젝트 솔루션을를 사용하는 응용 프로그램을 변환 할 때. 내 __declspec 매크로를 만들고 모든 클래스 적용된 최종 .exe 만듭니다 프로젝트의 제외한. 그러나 링커는 모든 것을 막 맞춰두고 있습니다. 템플릿 개체를 내보내는 중 오류를 무시하도록 설정했습니다.

오류 LNK2019 :

한 예로이있다되지 않은 외부 기호 "__declspec (같이 DllImport) 공개 : 무효 __thiscall 레일 :: SetNextRail (클래스 레일 *)"? (__imp_ SetNextRail @ 레일 함수에서 참조 @@ QAEXPAV1 @@ Z) ? "공공 정적 무효 __cdecl MyUtilities :: CreateBezierRails (INT, 클래스 MyVector의 *, 클래스 표준 : : 벡터> &)"(CreateBezierRails @ MyUtilities @@ SAXHPAVMyVector @@ AAV? $ 벡터 @ PAVRail @@ V? $ 할당 자 @ PAVRail @@@ std @@@ s td @@@ Z) MyUtilities.obj

내 __declspec (dllimport)에 해결되지 않은 외부 기호가 있습니까? 그건 맞지 않아.

#ifdef MYAI_EXPORT 
#define DECLSPECAI __declspec(dllexport) 
#else 
#define DECLSPECAI __declspec(dllimport) 
#endif 

기본적으로 무엇이 제공됩니까? 이러한 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까? 지금까지 도와 주려고 애쓰시는 모든 분들께 감사 드려요.

답변

2

MyRenderer.lib와 연결하고 있습니까?

+0

마찬가지로 프로젝트 종속성이 있습니다 (Visual Studio를 사용하고 있습니다, 죄송합니다). 예 –

+0

.lib 파일은 프로젝트 속성> 구성 속성> 링커> 입력> 추가 종속성에 나열됩니다. 프로젝트 의존성은 다른 것입니다. –

+0

설명해 주셔서 감사합니다. 나는 이것을 추가하고 이제 "입력 파일 'MyRenderer.lib'을 열 수 없습니다. 가서 검사했는데, MyRenderer의 출력/디버그 폴더에 있지만 MyAI의 출력/디버그 폴더에 없습니다. –

0

글자가 있지만 선언이 있지만 구현이 없다는 내용입니다. 함수가 구현 된 파일을 컴파일하고 있습니까? MyRenderer :: DrawVertices 호출하기 전에 기억하는 기억나요? 두 라이브러리를 모두 실행 파일에 연결하고 있습니까?

편집 : 라이브러리를 컴파일 할 때 라이브러리는 스텁을 효과적으로 남겨 놓습니다. 실제로이 기능을 사용하려면 링크해야합니다.

링커를 실행하면이 스텁을 찾는 모든 라이브러리가 실행되어 실제 구현에 링크됩니다. 빌드하는 각 cpp 파일은 오브젝트 파일로 컴파일되며이 오브젝트 파일은 정확히 동일한 f 식으로 작동합니다. 스텁을 실제 함수에 연결할 수 없다면 보는 것과 같은 링커 오류가 발생합니다. 따라서 렌더러 라이브러리가 실행 파일에 링크되어 있지 않거나 구현에 MyRenderer ::와 같은 중요한 요소가 없습니다. 후자라면 IDirect3DDevice가 부족하다는 것과 같은 다른 문제가 발생할 것으로 예상됩니다. IDirect3DDevice는 클래스의 멤버입니다. 따라서 대부분의 경우 .lib 파일을 연결하지 못했습니다.

+0

파일을 구현하여 컴파일 중입니다. 예. 구현시 MyRenderer의 인스턴스를 만든 다음 렌더러 -> DrawVertices를 사용하여이 인스턴스를 참조합니다. 실행 가능 파일에 대한 두 라이브러리의 선호에 관해서, 나는 그렇게 믿는다. 그러나 나는 이것에 새로운 것이다. 이것은 .lib로 완벽하게 컴파일되고 실행되었습니다. –

+0

링크가 있어야합니다. 나는 C++을 처음 사용하기 때문에 불행하게도이 문제를 어떻게 해결할지는 잘 모릅니다. –

2

당신은

__declspec(dllexport) 

를 사용하여 함수와 클래스를 내 보낸

__declspec(dllimport) 

사용하여 가져올 수 있습니까? 그렇지 않은 경우이 작업을 수행해야합니다. 헤더를 컴파일 할 때 DLL을 컴파일하는 동안 dllexport 절이 있어야하며 다른 DLL 또는 EXE에서 헤더를 사용할 때는 dllimport 절을 사용해야합니다.

// set this in preprocessor options for the DLL 
#ifdef MYDLL 
# define MYDLL_IMPORTEXPORT __declspec(dllexport) 
#else 
# define MYDLL_IMPORTEXPORT __declspec(dllimport) 
#endif 
class MYDLL_IMPORTEXPORT MyClass {}; 
+0

예! 나는 이것을 가지고있다. 해결되지 않은 외부 기호에 대한 몇 가지 오류가 "해결되지 않은 외부 기호 __declspec (dllimport) public : void _thiscall Rail :: SetNextRail"등입니다. –

0

과 같은 매크로를 정의하면 쉽게 다른 작업을 수행 할 수 있습니다. DLL의 구성이 다릅니다.

  • 정적으로 링크 된 DLL - 구현은 DLL에 있으며 정의는 .lib에 있습니다. 정적으로 .lib (헤더와 비슷합니다)에 링크하고, lib는 C++에 함수 호출 방법을 알려줍니다. 이것은 아마도 당신이 원하는 것입니다. __declspec이 맞는지 확인하십시오.
  • 동적으로 링크 된 DLL - 모든 것이 DLL에 있으며 정의가 DLL에도 있습니다. 런타임에 문자열로 인덱싱되는 모든 내 보낸 항목에 대한 함수 포인터를 수동으로 설정해야합니다.

Google이이 CW를 작성하고 도와 주므로 누군가가이 대답을 덜어 줄 수 있습니다.

또한 골격 응용 프로그램에서 작동하는 DLL을 얻는 것이 좋습니다.