2013-07-12 2 views
0

Linux 환경에서 C 및 C++의 기본 코드를 실행하려고합니다. eclipse를 사용하여 실행 중입니다. 현재 프로젝트는 C 프로젝트로 생성됩니다.링커 오류 -C 파일의 C++ 파일에서 함수 호출

내가하려는 것은 동일한 폴더에있는 다른 파일에서 함수를 호출하는 것입니다. 나는 주를 sample.c에, 주 sum(int a, int b)A.c에 호출하고 싶습니다. 나는 그것을 실행할 수 있었다. 그러나 A.cpp (C++ 템플릿 파일)에 동일한 함수 합계를 다시 작성하면 링커 오류가 발생합니다.

gcc -o "Test" ./sample.o 

./sample.o : 기능에서는 메인 LD : collect2를 '/ 홈/IDTECH/공간/테스트/디버그 /../하여 Sample.c : 19 기준은 정의되지 않은 합계를' 1

내가 같은 폴더에 C 파일에서 C++ 파일에있는 함수를 호출에 도움이 필요 * [테스트] 오류 : 1 종료 상태 메이크업을 반환했습니다. 이 링커 문제를 해결하는 데 도움을주십시오.

감사

Harsha에

+0

일반적으로 다른 사람들이 문제를 진단 할 수 있도록 코드 스 니펫을 게시하는 것이 가장 좋습니다. 그러나 나는 당신이'extern "C"'를 사용할 필요가 있다고 생각할 수있다. 여기를보십시오 : http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c/1041880#1041880 – JoshG79

답변

2

는 C++ 타입 정보를 인코딩하기 위해 컴파일러 mangles 기호 이름. C 코드에 노출되어야 C++ 함수를 작성할 때 일반적으로, 당신과 같이, extern "C" { ... } 블록의 기능을 래핑 (또는 @DaoWen 지적으로 단지 extern "C"으로 접두사) 할 수 있습니다 :

A를 CPP :

extern "C" { 
    int sum(int a, int b) 
    { 
     return a+b; 
    } 
} 

caller.c :

extern int sum(int a, int b); 
... 
int main() { sum(42, 4711); } 

extern "C" 등의 기능을 표시하여, 당신은을 희생하고 다른 과부하는 의 기호 이름으로 구별 할 수 있기 때문에 과부하가 걸릴 수 있습니다. 이것이 의미하는 바는 다음과 같이 할 수 없다는 것입니다.

extern "C" { 
    int sum(int a, int b) { return a+b; } 
    float sum(float a, float b) { return a+b; } // conflict! 
} 
+2

만약 당신이 그런 기능을 하나만 가지고 있다면, extern "C"int sum (int a, int b) {' – DaoWen

+0

그것이 작동하지 않는 이유를 설명하는 것뿐만 아니라 (mangling) , 솔루션의 단점 ** (과부하 없음). –

+0

마틴 톤 감사합니다, 나는 그것을 해결할 수있었습니다. – Harsha