2011-09-30 4 views
2

DLL 래퍼를 만드는 MSVC2010에 C++ 코드 섹션이 있습니다. 코드의 섹션부적절한 DLL 내보내기 섹션

_declspec(dllexport) int64 _stdcall myDllExportFunction2(<someType> someParameter){ 
{ 
    return new (DWORD)SomeExternalFunction(SomeParameter); 
} 

난 그냥 완전한 함수 이름을 포함하도록이 DLL에 DUMPBIN을하고부터 내 수출 섹션을 기대 ...

extern "C" __declspec(dllexport) DWORD myDllExportFunction() 
{ 
    return (DWORD)SomeFunction(SomeParameter); 
} 

나 ...를 다음과 같이 보입니다 그러나 그것은 더 많이 이것처럼 보인다.

[email protected] = [email protected] 

왜이 등호가 그 의미인지 알 수 없습니다. 필자는 dll을 가져 오는 프로그램에서 함수가 액세스 할 수 없다는 강한 느낌을 가지고 있습니다.

/Zi /nologo /Wall /WX- /O2 /Ob2 /Oi /Oy- /D "_WINDLL" /D "_MBCS" /D "_AFXDLL" /Gm- /EHsc /GS /fp:precise /Zc:wchar_t /Zc 

링커 옵션 :

/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\....\MyProj.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"C:\....\MyProj.pgd" /TLBID:1 /DYNAMICBASE:NO /NXCOMPAT:NO /IMPLIB:"MyProj.lib" /MACHINE:X86 /ERRORREPORT:QUEUE 

참고 :/IMPLIB :

충분한 정보를 제공하기 위해 내 컴파일러 및 링커 스위치

컴파일러 옵션의 일부를 포함했다 " MyProj.lib "->이 가져 오기 라이브러리에는 dll에 있어야하는 형식으로 내 DLL에 갖고 싶은 모든 내보내기가 있습니다.

내 프로젝트 옵션에서이 문제를 일으킬 수있는 설정이 있습니까? 지난 몇 년간 dllexport에 변경이 있었습니까? 내 문제를 이해하는 데 도움이되는 정보를 제공해 줄 수 있습니까?

+1

덜 혼잡 한 출력을 얻으려면 .pdb 파일을 삭제하십시오. –

답변

3

디버그 정보 생성을 해제하십시오.

enter image description here

+0

내 보낸 함수의 이름에는 영향을주지 않습니다. –

+0

@BenVoigt 이것은 실제로 문제에서 설명하고있는 오류입니다. +1, 그러나 충분하지 않은 담당자에게 : * ( – Satyrn

0

당신은 아마도 별도의 선언, 그것은 __stdcall 선언하여 이름을 엉망했다. 이름 변환을 피하려면 __cdecl 호출 규칙을 제공해야합니다.

+0

'__cdecl'은 이름 맹 글링을 피하지 않습니다. 규칙을 바꿉니다. –

+0

@BenVoigt 이것은 실제로 시도했을 때 맹 글링을 제거하는 것처럼 보였습니다. 그러나 제거를 요청하지 않았습니다. mangling (나는 아직도보고 싶었다.) – Satyrn

+0

@Ben : 이름 짓기에 영향을 줄 수있다. http://msdn.microsoft.com/en-us/library/x7kb4e2f.aspx –

0

내 보낸 함수의 이름을 제어하려면 (예 : mangling을 제거하려면) module definition (.def) file 링커를 사용해야합니다.

+0

나는 name mangling을 제거 할 필요가 없다. 그러나 이것을 시도해 보았고, 링커 에러로 인해서 C 클래스에서이 메소드들을 찾지 못한다. 다음은 def 파일의 예입니다. [code] LIBRARY myProjectname EXPORTS "myDllExportFunction @ 12" – Satyrn

+0

@Satyrn :'LIBRARY myProjectname EXPORTS myDllExportFunction'과 같은 .def 파일에 함수 이름을 넣으면됩니다. . 따옴표 없음, 스택 크기 주석 없음 'EXPORTS myDllExportFunction = _myDllExportFunction @ 12'가 필요할 수도 있지만 일반적으로 링커가 그 숫자를 나타냅니다. 주요 밑줄에주의를 기울이십시오. –

+0

다른 사람의 답을 찾았지만 def 파일을 사용하려고하면 LNK2001 오류가 "해결되지 않은 외부 기호"로 표시되고 특히 이유는 알지 못합니다. 각 기능에 대해 def 파일에서 mangling이라는 이름을 제거했습니다. – Satyrn

0

이름 변경을 방지하기위한 몇 가지 다른 옵션이 있습니다.

  • 변경 __cdecl__stdcall에서 내 보낸 함수에 대한 선언 지정자. 당신이 이름 맹 글링 해결하기 위해 다음 두 가지 방법 중 하나를 __stdcall 호출 규칙 사용을 사용해야하는 경우 그래서 함수 서명은 이

    extern "C" DWORD __declspec(dllexport) __cdecl myDllExportFunction()

처럼 보일 것입니다. 두 경우 모두 __declspec(dllexport)을 함수 정의에 추가 할 필요가 없습니다 (그러나 그렇게하면 괜찮습니다).

  • a.데프 라인

LIBRARY YourLibraryName 프로젝트 속성에서
수출
        myDllExportFunction

  • 프로젝트가 함유 파일, 링커로 이동 -> 명령 줄 편집 상자에 추가 옵션 추가 /export:myDllExportFunction
+0

내 보낸 함수 목록은 같은 줄이 아니라'EXPORTS' 키워드 아래에 있다고 생각합니다. 그리고'__cdecl' 함수 이름은 계속해서 밑줄을 긋게됩니다. –

+0

@BenVoigt 감사합니다. 당신은 def 파일 구문에 대해 옳습니다. 그러나'__cdecl' 함수 이름은 밑줄을 쳐서 맹 글링하지 않습니다. 나는 앞에서 열리는 작업 프로젝트를 가지고 있습니다. – Praetorian

+0

x86 또는 x64 그것은 규칙도 바꿉니다. http://en.wikipedia.org/wiki/Name_mangling#C_name_decoration_in_Microsoft_Windows –

관련 문제