C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,
C语言则不会,直接将会将函数名作为中间函数名称。
因此C++程序调用C方式编译的函数时, 可能会在链接时找不到对应的函数。
例子:
// extern.h
1 int sum(int a,int b);
//extern1.c
1 int sum(int a,int b) 2 { 3 return a+b; 4 }
//extern2.cpp
#include <iostream> using namespace std; extern int sum(int a,int b); int main() { cout<<sum(3,2)<<endl; return 0; }
编译: gcc -c extern1.c //按照c的方式编译sum函数
g++ -c extern2.cpp // 按照c++的方式调用sum函数
然后: g++ extern2.o extern1.o //链接成exe
注: 对于.c后缀名的程序,gcc认为是c程序,g++认为是c++程序; 对于.cpp后缀名的程序,gcc和g++都认为是c++程序。
结果:
extern2.o: In function `main': extern2.cpp:(.text+0xf): undefined reference to `sum(int, int)' collect2: ld returned 1 exit status
//正确的使用旧文件extern.c中sum函数的方法:extern3.cpp
1 #include <iostream> 2 using namespace std; 3 extern "C" {int sum(int a,int b);} 4 int main() 5 { 6 cout<<sum(3,2)<<endl; 7 return 0; 8 }
链接: g++ extern1.o extern3.o 正确!
总结: 当c++程序需要调用之前用C方式编译出来的.a .so, 可以使用 extern "C".