2010-06-29 6 views
4

Possible Duplicate:
Convert some code from C++ to CC 코드는 C++로 컴파일하지만 C

내가 컴파일러에게하면 바로 C를 것으로 보인다 몇 가지 코드를 가지고로로 컴파일 (나는 비주얼 스튜디오 2008 익스프레스를 사용하고 있습니다)하지 C + +, 그것을 컴파일하고 링크 잘. 내가 C로 컴파일 할 때,하지만,이 오류가 발생합니다 :

1>InpoutTest.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 
1>InpoutTest.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 

코드는 Inpout.dll를 사용에서 읽기 및 병렬 포트에 기록합니다. Inpout.lib와 Inpout.dll이 둘 다 있습니다. 여기 코드는 : 나는 이전에 잘못이 질문에, here을 요청

// InpoutTest.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include "stdio.h" 
#include "string.h" 
#include "stdlib.h" 
/* ----Prototypes of Inp and Outp--- */ 

short _stdcall Inp32(short PortAddress); 
void _stdcall Out32(short PortAddress, short data); 

/*--------------------------------*/ 

int main(int argc, char* argv[]) 
{ 

int data; 

if(argc<3) 
{ 
    //too few command line arguments, show usage 
    printf("Error : too few arguments\n\n***** Usage *****\n\nInpoutTest read <ADDRESS> \nor \nInpoutTest write <ADDRESS> <DATA>\n\n\n\n\n"); 
} 
else if(!strcmp(argv[1],"read")) 
{ 

    data = Inp32(atoi(argv[2])); 

    printf("Data read from address %s is %d \n\n\n\n",argv[2],data); 

} 
else if(!strcmp(argv[1],"write")) 
{ 
    if(argc<4) 
    { 
    printf("Error in arguments supplied"); 
    printf("\n***** Usage *****\n\nInpoutTest read <ADDRESS> \nor \nInpoutTest write <ADDRESS> <DATA>\n\n\n\n\n"); 
    } 
    else 
    { 
    Out32(atoi(argv[2]),atoi(argv[3])); 
    printf("data written to %s\n\n\n",argv[2]); 
    } 
} 



return 0; 
} 

.

도움을 주시면 감사하겠습니다.

extern "C++" { 
    short _stdcall Inp32(short PortAddress); 
    void _stdcall Out32(short PortAddress, short data); 
} 
+0

요즘 C가 맹 글링 된 이름을 사용합니까? 나는 링커 오류에서'@ 4 '와'@ 8'을보고있다. 내가 심각하게 혼동하지 않는 한, C++ 이름 맹 글링처럼 보이지는 않지만, 그것들은 확실히 장식되지 않은 함수 이름이 아닙니다. – Steve314

+2

이것은 이전 질문에 대한 간략한 설명입니다. http://stackoverflow.com/questions/3142420/convert-some-code-from-c-to-c. 두 번 게시하지 마십시오. –

+0

@ 에반 : 다른 질문에 대한 새로운 의견을 얻지 못했기 때문에 다시 질문했습니다. 죄송합니다. –

답변

6

C에서 C++ 함수에 연결하려고합니다. 이름 변환으로 인해 작동하지 않습니다. 링커는 함수를 찾을 위치를 알지 못합니다. C++에서 C 함수를 호출하려면 extern "C"로 표시해야합니다. C는 extern "C++"을 지원하지 않습니다. 다른 대답들 중 하나가 있다고 말합니다. 또는 C로 소스 코드를 다시 컴파일하십시오.

편집 : 왜 C++로 컴파일 할 수 있다면 C로 컴파일할까요?

+0

C++로 컴파일하려고하면 C 프로젝트에서 Out32를 호출해야 오류가 발생합니다. –

+0

나는 lib 용 소스를 C로 다시 컴파일했다. (afxres.h에서 winres.h 로의 레퍼런스를 변경 한 후에) –

5

그것은 컴파일러가 자신의 이름이 엉망이되는 방법을 알 수 있도록 당신이 그런 상태로 표시 할 수 있도록 Inp32Out32처럼 C++ 파일/라이브러리에 외부에서 정의하는 소리 컴파일러 오류로 보이지만 오히려 링커 오류입니다. 링커에서 Inp32Out32의 정의를 찾을 수 없습니다. 정의가 포함 된 라이브러리에 연결하고 있습니까? 당신은 그 철자를 정확하게 입력 했습니까?

+0

그러면 오류 C2059가 발생합니다. 구문 오류 : 'string' –

+0

'extern "C++"있나요? 휴대용이 아닌가요? 그 함수가 선언 된 헤더 파일에서'extern "C"'를 사용하고,'# ifdef' 가드 만 사용하여 C++ 컴파일러 만이 그것을 볼 수 있도록합니다. C 컴파일러는 이미 C 호출 규칙을 사용합니다. – Steve314

+0

@ 스티브 다른 방법으로하는 것이 훨씬 더 일반적이지만 그렇습니다. 필자는 실제로 이것을 사용할 필요가 없었기 때문에 이식성에 대해 확신하지 못했습니다. 라이브러리의 경우 그는 제어 할 수 없으며 소스 코드가 많지 않습니다. –

2

그렇지 않은 :

+0

내가 한 유일한 일은 C++보다는 C로 컴파일 할 파일의 설정을 변경하는 것이 었습니다. 나는 어떤 연결이나 아무것도 바꾸지 않았다. 링커 설정에서 변경해야 할 것이 있습니까? –

5

C 코드에서 C++ 루틴을 호출해야하는 경우 C++ 루틴은 함수를 extern "C"으로 표시하여 "C"링키지를 가져야합니다. 그것은 C++ 측에서 수행되어야합니다.

기존 C++ 코드를 변경할 수 있다면 Inp32()Outp32()의 프로토 타입으로 다음을 입력하십시오. 이 호출 무엇으로 포함하거나 Inp32() 또는 Outp32() 기능을 정의되어 헤더에 있어야합니다 - C 또는 C++ 코드 여부 : 규칙을 요구하는 C를 필요로하는 기능을 표시합니다, 그 기능을 호출 할 것이다

#ifdef __cplusplus 
extern "C" { 
#endif 

short _stdcall Inp32(short PortAddress); 
void _stdcall Out32(short PortAddress, short data); 

#ifdef __cplusplus 
} 
#endif 

C 또는 C++ 코드.

wrappers.h 헤더 파일 :

당신이 C++ 코드를 변경하는 기능이없는 경우

, 당신은 C++ 자신의 C++ 모듈의 기능을 위해 자신의 C 호환 래퍼를 만들 수 있습니다

// in wrappers.h 

// C-callable wrappers 

#ifndef WRAPPERS_H 
#define WRAPPERS_H 

#ifdef __cplusplus 
extern "C" { 
#endif 

short Inp32_wrapper(short PortAddress); 
void Out32_wrapper(short PortAddress, short data);  

#ifdef __cplusplus 
} 
#endif 

#endif /* WRAPPERS_H */ 

그리고, wrappers.cpp 구현 :

// in wrappers.cpp file: 

#include "wrappers.h" 

// prototypes for the C++ functions - these really should be in a 
// header file... 

short _stdcall Inp32(short PortAddress); 
void _stdcall Out32(short PortAddress, short data); 

// implementation of the wrappers 

short Inp32_wrapper(short PortAddress) 
{ 
    return Inp32(PortAddress); 
} 

void Out32_wrapper(short PortAddress, short data) 
{ 
    Out32(PortAddress, data); 
} 

이제 C 코드 #include "wrappers.h" 수 단순히 EXI를 호출 래퍼 함수를 ​​호출 C++ 함수를 사용하여 작업 할 수 있습니다.