我具有以下设置:链接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
而不重命名它们?
我认为,为extern“C”将防止重命名的发生。即。 extern“C”void sol(){cout <<“HW !! \ n”;} – bizzehdee
'extern“C”'http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B#Linking_C_and_C.2B。 2B_code –
在混合的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()'或者其他任何你喜欢的名字。 –