2013-01-07 3 views
0

내 프로그램에 이미 존재하는 라이브러리를 연결하려고합니다. 내 프로그램은 C++로 작성되었고 라이브러리는 C로 개발되었습니다. 컴파일하고 링크하는 동안 문제가 발생합니다.gcc와 g ++ 코드 연결하기

gcc 라이브러리를 g ++ 소스와 연결하는 것과 관련하여이 포럼의 많은 게시물을 추적했습니다. 여하튼, 나는 몇몇 문제를 해결할 수 있었다. 이제 저는 한 가지 문제에 직면하고 있습니다. 여기 내 문제의 세부 사항입니다. testlib.h 파일

int sum(int x, int y) 

In testlib.c file 

int sum(int x, int y) { 
    return x + y; 
} 

에서

나는 이러한 파일의 정적 라이브러리를 만들었습니다.

다음 단계는 g ++ 소스 코드에서이 함수를 사용하는 것입니다. call.hh 파일에서

,

#include<iostream> 


#include "testlib.h" 

using namespace std; 

extern "C" { 
    int sum(int x, int y); 
} 

namespace math_operation { 
    void show_addition(int x, int y); 
} 

나는

#include "call.hh" 
#include<iostream> 

using namespace std; 

void math_operation::show_addition(int x, int y){ 
    cout<<" sum "<<sum(x, y)<<endl; 
} 

이제 call.cc 파일에이 기능을 정의, 나는 main.cc

#include "call.hh" 

using namespace math_operation; 
int main() { 
    int x = 10; 
    int y = 15; 
    show_addition(x, y); 
    return 0; 
} 

에서이 함수를 호출 두 가지 문제가 있습니다 : 먼저 함수를 선언 한 이후로 컴파일 오류가 발생합니다. int sum (int, int) 두 번. 그러나 call.hh에 extern "C"{int sum (int, int)}를 선언하지 않으면 컴파일 문제가 해결되고 링커 문제가 다음 오류로 생성됩니다. `sum (int, int) '

어떻게 해결할 수 있습니까?

답변

3
extern "C" { 
#include "testlib.h" 
} 

직접 신고하지 마십시오. 일해야한다. testlib.h를 들어

+0

충돌 오류가 발생했습니다. – Exchhattu

+3

'gcc -c testlib.c -o testlib.o; g ++ main.cc call.cc testlib.o -o main' 작동합니다. – aragaer

0

extern "C"로 함수를 선언해야 C++ 파일에서 사용할 수있을 :

#ifdef __cplusplus 
extern "C" { 
#endif 

int sum(int x, int y); 

#ifdef __cplusplus 
} 
#endif 

을 그럼 당신은 정의가 선언과 일치 sumextern "C"로 정의 할 때, 당신은 재 선언 중 하나를 얻을하지 않습니다 오류 또는 정의되지 않은 참조

당신이 다음 testlib.h을 편집 할 수없는 경우 aragaer의 대답은 같이 당신은 extern "C" 블록 내부에 포함시킬 수 :

extern "C" { 
#include "testlib.h" 
} 

(그러나 이것은 일반적으로 해키 해결 방법이며,이 라이브러리를 수정하는 것이 좋습니다)

당신은 당신이 헤더 사용해야합니다, 그것을 선언하는 헤더가있다, 자신의 call.hh 파일에 sum를 선언 안 (헤더 내부 또는 주위에 extern "C"을 추가하는 자사의 #include 필요한 경우)