2014-02-20 2 views
1

객체 ++ 나는 다음과 같은 설정이 있습니다링크하기 C 및 C 파일

을 main.c :

extern void sol(); 
int main(){ 
    sol(); 
} 

sol.cc : 나는 별도의 오브젝트 파일로 컴파일

#include<iostream> 
using namespace std; 
void sol(){ 
    cout<<"HW!!\n"; 
} 

:

$gcc main.c -c 
$g++ sol.cc -c 

하지만 링크하려고 할 때 단일 실행에,

$g++ main.o sol.o 

내가 얻을 : nm main.oU sol을 요구하면서 main.c:(.text+0x7): undefined reference to 'sol'nm sol.o00000000 T _Z3solv이 있음을 보여줍니다. C++의 함수 이름을 변경하면 동일한 이름의 오버로드 된 함수를 피할 수 있습니다. 컴파일러에게 sol.o의 이름이 바뀐 함수가 포함되어 있거나, 이름을 바꾸지 않고 sol.cc을 컴파일하는 방법이 있습니까?

+0

내가 그 통근자 "C"가 일어나고에서 이름 변경을 방지합니다 생각합니다. 즉. extern "C"void sol() {cout << "HW !! \ n";} – bizzehdee

+0

'extern "C"'http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B#Linking_C_and_C.2B. 2B_code –

+0

일반적으로'main()'함수는 C와 C가 혼합 된 프로그램에서'int main (int argc, char ** argv) {return c_main (argc, argv); }'전체에서 (extern "C"int c_main (int argc, char ** argv);와 같은 선언으로). 원래의'main()'은 간단히'c_main()'또는'real_main()'이나 다른 이름으로 변경되었습니다. –

답변

1

당신은 C. 사용할 수 sol 공통 헤더에이를 넣어 만들기 위해 extern "C" 선언을 사용해야합니다 :

extern "C" void sol(); 
+2

일반적인 헤더를 원한다면'extern "C"'가 C에서 유효하지 않으므로'#ifdef __cplusplus'를 사용하여 주위를 둘러야합니다. –

3
extern "C" void sol() 
{ 
    cout<<"HW!!\n"; 
}