C++学习 -3 C和C++的混合编程及库的调用

前导小知识;标准库
c++是C的超集,c文件都可以用g++来编译,那么怎么区分c文件是gcc编译还是g++编译了。
g++提供了一个__Cplusplus宏,如果这个宏定义了则是g++编译反之gcc编译,一般这样使用。
在这里插入图片描述
__cplusplus实际是什么意义呢?
在这里插入图片描述

C++支持c形式 的头文件,但是不建议那么用,会浪费额外的资源,因为C++对c头文件都有自己的封装后的头文件 如stido.h对应cstido在这里插入图片描述

为什么需要混合编程?存在优秀的c库在现在c++代码中仍然适用,或者同一项目有c和c加加合作完成

为什么可以实现混合编程?因为程序编译都是从源文件编译为二进制的的目标文件,然后通过链接把不同目标文件链接到一起形成可执行文件从而执行程序,而如果链接的时候能够完成将c语言gcc编译得到的目标文件和c加加g++得到的目标文件一起链接到一起则能够完成混合编程。

如何解决c和C++的混合编程?利用extern “c”{}来完成,这个是c加加才有的语法特性,目的就是告诉c加加编译器,接下来范围里面的才用c编译器的方式进行编译,则形成的函数中间名字也是采用c方式形成而不是c加加从而后来链接才能链接到一起去

1·如何混合编程;
(1)程序编译过程:源文件->目标(库)文件->可执行程序->镜像文件
(2)任何编程语言执行时都必须是可执行程序,所以都必须先被编译成目标文件
(3)混合编程的“混合”操作发生在链接这一步

2;C++和C混合编程的困难所在
(1)C++和C都是编译型语言,互相混合相对容易
(2)难点:C++支持函数名重载,而C不支持,因此编译器生成目标文件时,函数名在目标文件中的临时内部名称规则不同。导致链接时符号对不上
(3)解决方案:使用extern “C”{}; 让C++在对接的局部向C妥协兼容

3;实验验证extern 的效果;
(1)预备知识;
gcc clib.c -c -o clib.o 编译可执行程序
g++ -E clib.c -o clib.i 只进行预处理展开生产clib,i文件
objdump -d clib,o > clib.i 反编译将可执行程序逆向出汇编语言
C和C++中的函数在编译后都会在符号表里面用一个符号表示,也就是名称。

实验一;编译反编译;证明了C语言中名称为add的函数,编译后符号表中就叫add
在这里插入图片描述
实验二;证明了C++语言中名称为add的函数,编译后符号表中叫_Z3addii;并且其重载机制的命名

在这里插入图片描述
分析:同样的源码,编译后生成的二进制代码其实是一样的,所以功能其实也是一样的所以本质上是可以混合编程的,但是生成的中间符号名称不同,所以链接器难受。

实验三:证明了在C++的头文件中,只要把C++的函数的声明放在extern “C”{}的大括号范围之内,就可以让g++在编译这个函数时生成中间符号名时按照C的规则而不是按照C++的规则,所以这样的函数就可以和C的库进行共同链接。
在这里插入图片描述

4;C和C++库调用
三种情况
(1)同一个项目全部有源码,一次编译链接。
直接在C的头文件中加extern "C"声明,即可。则对应的函数都会使用c方法来生成符号表,从而不会冲突。
(2)同一个项目中C是库,C++是源码,C++调用C
在C的头文件中加extern "C"声明,在C++中直接包含头文件调用即可;因为给库都是给库和.h文件的

实践;
预备知识;
C语言如何编库;动态链接库的后缀为.os的,静态库的后缀为.a的
静态库;
gcc -c zw.c -o zw.o ;编译zw.c生成可执行程序zw.o
ar -rc libzw.a zw.o ;根据可执行程序zw.o打包生成zw.a的静态库。
gcc test,c -o test.o -lzw -L. ;使用静态库, -l后面接库名,不要后缀,-L后接库的路径。
nm可以查看.a文件有哪些符号。
在这里插入图片描述
(3)同一个项目中C++是库,C是源码,C调用C++
需要自己来一层封装,将带来的.h文件封装一下,并且把新的.h文件添加上extern "C"声明;
(1;用cpp写一个库,mylib.cpp mylib.hpp,用g++编译成静态库
(2;objdump反编译库,查看确认符号
(3;用cpp写一个封装层,用上extern “C”,cmylib.cpp和cmylib.hpp,用g++编译成静态库
(4;objdump反编译库,查看确认符号
(5;用c写一个main.c,调用wrapper库,用gcc编译链接,运行查看结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zw1996/article/details/104461505