2014-04-05 3 views
1

DLL을 암시 적으로 C 콘솔 응용 프로그램에 연결할 수 없습니다. 나는 빈 DLL 프로젝트 하나 개 main.c 파일 포함 "라이브러리"를 만든 2008 년DLL 암시 적 연결

비주얼 스튜디오를 사용

__declspec(dllexport) int get_value() 
{ 
    return 123; 
} 

I main.c 파일로도 만들어 빈 콘솔 프로젝트 "CallingProgram"

__declspec(dllimport) int get_value(); 

void main() 
{ 
    int result = get_value(); 
} 

"Linker \ Input \ Additional Dependencies"에 "Library.lib"를 추가했습니다.

그리고 여전히이 오류가 있습니다에서 LoadLibrary/GetProcAddress를 가진

error LNK2019: unresolved external symbol __imp__get_value referenced in function _main 

내가 만든 테스트 된 DLL을 - 그것은 잘 작동합니다.

내가 DUMPBIN을 사용하여 Library.dll을 확인하고 또한 좋아 보인다 :

Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file library.dll 

File Type: DLL 

    Section contains the following exports for Library.dll 

    00000000 characteristics 
    5340072C time date stamp Sat Apr 05 17:37:48 2014 
     0.00 version 
      1 ordinal base 
      1 number of functions 
      1 number of names 

    ordinal hint RVA  name 

      1 0 00011109 get_value = @ILT+260(_get_value) 

    Summary 

     1000 .data 
     1000 .idata 
     2000 .rdata 
     1000 .reloc 
     1000 .rsrc 
     4000 .text 
     10000 .textbss 

이 날이없는 것을 이해 도와주세요!

+0

.lib 파일에 dumpbin.exe/all을 사용하여 포함 된 내용을 확인하십시오. 엉덩이에서 촬영, 나는 당신이 C + + 소스 코드 파일에서 DLL을 구축하고 C 프로그램에서 사용하려고합니다 것. 식별자 이름의 mangling을 억제하기 위해서는'extern "C"'가 필요하다. –

+0

나는 dumpbin에서 나온 모든 정보를 어떻게 처리해야할지 모르겠다. 나는 extern "C"를 시도했다 - 그것은 도움이되지 않았다. – walruz

+1

한숨. .dll 파일에서 dumpbin.exe/exports를 사용하면 질문에 대한 복사/붙여 넣기에 충분할만큼 짧습니다. –

답변

4

1 0 00011109 get_value

기호에는 일반적인 장식이 없습니다. 일반적으로 _get_value 일 것이고, 모든 cdecl 함수는 앞에 밑줄을 붙입니다. __declspec(dllexport)을 사용하면 __imp_get_value 내보내기를 제공합니다. 바인딩을 최적화하는 함수 포인터입니다.

하지만 그런 일은 발생하지 않았습니다. 라이브러리 프로젝트에서 .def 파일을 사용해야합니다. 어떤 내 보낸 함수의 이름을 바꿉니다. 어느 쪽 괜찮아요,하지만 귀하의 __declspec(dllimport) 호환되지 않습니다, DLL은 더 이상 __imp_ 함수 포인터를 내 보냅니다. 링커는 가져 오기 라이브러리를 찾을 수 없기 때문에 불평합니다.

라이브러리 프로젝트에서 .def 파일을 제거하거나 (최상) exe 프로젝트의 선언에서 __declspec (dllimport) 특성을 삭제하여이 문제를 해결하십시오. 내 보낸 함수를 DLL에 선언하는 .h 파일을 작성하는 것이 좋습니다.

+0

+1 .h 파일 권장 사항. – harper

+0

대단히 감사합니다. 그것은 당신이 어떻게 그것을 알아낼 수 있었는지 매혹적입니다. DEF 파일은 내 문제의 근원이었습니다. 프로젝트에서 제거했지만 "Linker \ Input \ Module Definition File"필드에 남아 있습니다. – walruz