2017-10-16 5 views
0

저는 일반적으로 C#에서 작동하며이 문제에 대해서는 제게 당황 스럽습니다. 동적 링크 라이브러리를 만들 때 을 사용했습니다.클래스의 한 함수에 대해 LNK 2019 및 LNK2028 오류가 발생했습니다. 기타는 정상적으로 작동합니다.

난에 .cpp 파일에 이러한 방법을 사용

// DeveloperConsoleManager.cpp : Defines the exported functions for the DLL application. 
// 

#include "stdafx.h" 
#include "DeveloperConsoleManager.h" 

namespace DeveloperConsoleManager 
{ 
    double DeveloperConsoleLogic::Add(double a, double b) 
    { 
     return a + b; 
    } 


    bool DeveloperConsoleLogic :: CheckforValidFile(CString fileName) 
    {  
     return false; 
    } 
} 

DeveloperConsoleManager.h

#pragma once 
#include "atlstr.h" 

#ifdef DEVCONSOLEMANAGER_EXPORTS 
    #define DEVCONSOLEMANAGER_API __declspec(dllexport) 
#else 
    #define DEVCONSOLEMANAGER_API __declspec(dllimport) 
#endif 

namespace DeveloperConsoleManager 
{  
    class DeveloperConsoleLogic 
    { 
     public: 
      // Returns a + b 
      static DEVCONSOLEMANAGER_API double Add(double a, double b); 
      static DEVCONSOLEMANAGER_API bool CheckforValidFile(CString fileName); 
    }; 
} 

DeveloperConsoleManager.cpp

아래와 같이 I는 두 가지 방법을 정의

다른 프로젝트 (유형 : 응용 프로그램 (.exe)). 내가 솔루션을 빌드 할 때, 1 경고 C4273 경고 링커 오류

다음이 있습니다 : 'DeveloperConsoleManager이 :: DeveloperConsoleLogic이 :: 추가': 일치하지 않는 DLL 연동 E : \ md_69 \ developerconsolemanager \ developerconsolemanager.cpp 10

2 경고 C4273 경고 : 'developerConsoleManager :: DeveloperConsoleLogic :: CheckforValidFile': 일치하지 않는 DLL 연계 전자 : \ md_69 \ developerconsolemanager \ 오류 3 오류 LNK2028

16 developerconsolemanager.cpp : 해결되지 않은 토큰 (0A0004F1) "공공 : developerConsoleManager __cdecl 정적 부울 :: DeveloperConsoleLogic :: CheckforValidFile (클래스 ATL :: CStri "Public"함수에서 참조 된 CheckforValidFile @ DeveloperConsoleLogic @ DeveloperConsoleManager @@ $$ FSA_NV? $ CStringT @ _WV? $ StrTraitMFC_DLL @ _WV? $ ChTraitsCRT @ _W @ ATL @@@@@ ATL @@@ Z) : 무효 __thiscall의 CSaSsiConsoleUi :: UploadSsiCheck (무효) "(? UploadSsiCheck @ CSaSsiConsoleUi @@ $$ FQAEXXZ) E : \ MD_69 \ DeveloperConsoleUI SaSsiConsoleUI.obj

\

오류 4 오류 LNK2019 : 확인되지 않은 외부 기호"공공 정적 부울 __cdecl DeveloperConsoleManager :: DeveloperConsoleLogic :: CheckforValidFile (클래스 ATL :: CStringT>>) "? CheckforValidFile @ DeveloperConsoleLogic @ DeveloperConsoleManager @@ $$ FSA_NV? $ CStringT @ _WV? $ StrTraitMFC_DLL @ _WV? $ ChTraitsCRT @ _W @ ATL @@@@ (공백) __thiscall CSaSsiConsoleUi :: UploadSsiCheck (void) "(UploadSsiCheck @ CSaSsiConsoleUi @@ $$ FQAEXXZ) E : \ MD_69 \ DeveloperConsoleUI \ SaSsiConsoleUI.obj

오류 5 오류 LNK1120 :이 확인되지 않은 외부의 E : \ MD_69 \ 디버그 \ DeveloperConsoleUi.exe이

"추가"방법에 대한 링커 오류가 없습니다.

링커 -> 입력 -> 추가 종속성에 이미 "DeveloperConsoleManager.lib"가 포함되어 있습니다. 정확하게 내가 뭘 잘못하고 있는지 찾아 내도록 도와주세요. 필요한 추가 정보를 추가하게되어 기쁩니다.

+0

_'DeveloperConsoleManager :: DeveloperConsoleLogic :: Add ': 일관성없는 DLL 링키지 –

+0

@ manni66 미안하지만 좀더 자세히 설명해 주실 수 있습니까 – RMad9248

+0

고쳐주세요. 어쩌면 나머지는 수정 될 것입니다. –

답변

0

@Igor Tandetnik 덕분에 인터넷이라는 멋진 점을 발견했습니다. 나는 다른 사람이 유익 할 수 있도록 대답으로 추가하고 있습니다.

문제는 CString에서 발생했습니다. 함수가 정의 된 프로젝트는 동적 연결 라이브러리 (dll)이며 호출은 MFC 응용 프로그램에서 수행됩니다. 이제 문제는 비 MFC dll이 사용하는 동안 MFC가 CString에 사용한다는 것입니다.에는 다음과 같이 정의되는 동안

typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL<TCHAR> > CString; 

:

typedef CStringT< TCHAR, StrTraitATL<TCHAR> > CString; 

이 당신이 다른 명확하게 볼 수 있듯이,

CString을은에로 정의됩니다. 내가 사용한 해결 방법은 using CAtlString instead of CString입니다. 그러나 우연히 만나게되면 더 좋은 방법을 제안하십시오.