2014-02-20 44 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 

我得到:main.c:(.text+0x7): undefined reference to 'sol'nm sol.o表明,有00000000 T _Z3solv,而nm main.o需要U sol。我发现C++重命名函数以避免重载函数的名称相同。有没有什么办法告诉编译器sol.o包含重命名的函数,或编译sol.cc而不重命名它们?

+0

我认为,为extern“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

在混合的C和C++程序中,通常最好使main()函数成为C++函数,即使它由int main(int argc,char ** argv){return c_main(argc,argv ); (完全相同)(声明相当于'extern“C”int c_main(int argc,char ** argv);'in scope)。原来的C'main()'只是简单地改名为'c_main()' - 或'real_main()'或者其他任何你喜欢的名字。 –

回答

1

您必须使用extern "C"声明作出sol提供给C.将这个变成一个共同的标题:

extern "C" void sol(); 
+2

如果你想要一个通用的头文件,你需要使用'#ifdef __cplusplus',因为'extern“C”'在C中是无效的。 –

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