2012-03-15 2 views
1

Visual Studio 2010에서 작성한 미리 컴파일 된 라이브러리 (.lib)로 작업하고 있습니다. 내 솔루션에는 두 개의 프로젝트가 있습니다. 첫 번째 프로젝트 (C)는 라이브러리를 빌드합니다. 두 번째 프로젝트 (C++)는 라이브러리를 테스트하기위한 Win32 콘솔 응용 프로그램입니다. 내가 시도한 모든 것은 링커 오류를 해결하지 못한다. (모든 것이 동일한 솔루션에 있기 때문에 이것이 쉬운 일이라고 생각했습니다.) 어떤 포인터라도 감사 할 것입니다. 감사.Visual Studio에서 미리 컴파일 된 라이브러리로 응용 프로그램을 작성하는 방법

1> MyProject.obj : 오류 LNK2019 : 여기

내가 무엇입니까 링커 오류가 확인되지 않은 외부 기호 "무효 __cdecl의 my_function는 (무효)"(? my_function @@ YAXXZ) 함수에서 참조 _wmain

1> C : 바탕 화면 \ MySolution \ 디버그 \ MyProject.exe \ \ 문서 및 설정 \ 사용자 : 치명적인 오류 LNK1120 : 1 개 확인되지 않은 외부

이것은 Win32 콘솔 응용 프로그램의 코드입니다

#include "stdafx.h" 
#include "my_api.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    my_function(); 

    return 0; 
} 

여기 my_functionmy_api.h에 선언하는 방법은 다음과 같습니다

extern VOID my_function(VOID); 
+0

.c 라이브러리의 출력 디렉토리가 C++ 프로젝트의 라이브러리 경로에 있습니까? 불행히도, 단지 같은 솔루션에있는 것만으로는 충분하지 않습니다. (C#과는 대조적으로 쉬운 곳입니다) –

+0

링커 오류를 추측하지 마십시오. –

+0

@HansPassant : 사과드립니다. 귀하의 정중 한 제안에 감사드립니다. 링커 오류와 그 원인이되는 코드를 추가했습니다. –

답변

2

당신은 그 기능을 C 코드에서 정의 된 것을 이해하는 링커의 순서를 declare your function with C linkage 필요하지 C++ 코드 :

// my_api.h 
#ifdef __cplusplus 
extern "C" { 
#endif 

extern VOID my_function(VOID); 
// more function declarations etc. 

#ifdef __cplusplus 
} 
#endif 

하나의 기능 만있는 경우 괄호를 삭제할 수 있습니다.

// my_api.h 
#ifdef __cplusplus 
extern "C" 
#endif 
extern VOID my_function(VOID); 
+0

두 가지 모두 좋은 답변이지만, 내가 생각하지 않은 문제가 귀하의 의견으로 인해 해결 되었기 때문에 귀하를 받아 드리고자합니다. 감사! –

1

라이브러리 프로젝트의 출력 디렉터리 (해당 프로젝트에서 확장되는 $(OutDir))가 테스트 프로젝트의 링커 검색 경로에 있는지 확인하십시오. 이렇게하려면 프로젝트 속성 대화 상자로 이동하십시오. Linker -> General에서 디렉토리가 Additional Library Directories으로 설정되어 있는지 확인하십시오. 또한 Linker -> Input에서 라이브러리 자체 (my_api.lib)가 Additional Dependencies에 나열되어 있는지 확인하십시오.

+0

큰 의견에 감사드립니다. 내 프로젝트 설정을 정리하는 데 도움이되었습니다. :) –

관련 문제