linux-Linux下_CC++混合编程.md
c 和 c++ 的混编
一、extern“C”的作用(最重点)
\1. extern “C”的真实目的是实现类C和C++的混合编程。extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。extern “C”后面的函数不使用的C++的名字修饰,而是用C。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数。
\2. C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与c语言的不同。假设某个函数的原型为:void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。
\3. 被extern “C”限定的函数或变量是extern类型的;extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。被extern “C”修饰的变量和函数是按照C语言方式编译和连接的。
\4. 与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern “C”修饰。
二、extern“C”与__cplusplus
1 | #ifdef __cplusplus |
Cplusplus(C plus plus)即”C++”,用于C++文档的头文件中,上面代码的意思是:如果是C++文件(*.cpp)后缀,则使用 extern “C”,在C++项目中应用的非常广泛。即使用gcc编译器编译,函数名为C类型如_foo。个人认为,搞懂了这两个关键字,尤其是理解extern “C”(再次强调,不为过,呵呵),接下来的混合编程也就差不多了,哈哈哈。。。。
原文链接 : http://blog.csdn.net/huangblog/article/details/8440194
下面是我踩过的坑
1、 __gxx_personality_v0 for?原因:cpp 和 c文件编译搞混,cpp文件应该使用g++编译器,而c文件应该使用gcc编译器。
一般来说
\1. gcc指定的参数是
CC ?= gcc
CFLAGS = -g -O2 -Wall
SHARED := -fPIC –shared
\2. g++指定的参数是
CC ?= g++
CFLAGS = -g -O2 -Wall -I$(LUA_INC) -std=C++11 -lstdc++ -frtti -fexceptions -fsigned-char
SHARED := -fPIC –shared
根据需求可以去掉 运行时识别、异常、有符号char
stackoverflow 解答
http://stackoverflow.com/questions/329059/what-is-gxx-personality-v0-for
Of course, if nothing is using exceptions, you can disable them with -fno-exceptions (and if nothing is using RTTI, you can also add -fno-rtti). If you are using them, you have to (as other answers already noted) link with g++ instead of gcc, which will add -lstdc++ for you.