目录
C的编译器去编译c++写的函数代码 本质是因为c++和c的编译器在对函数重命名的命名方式不同。函数名不同,在链接过程中会找不到对应函数的定义,所以会导致报。
在日常编程过程或者公司工作合作时,我们难免会需要用到他人或者曾经写的代码,但是之前的代码是使用.c格式写的,现在又用的.cpp格式,或者反过来。而ctrl+c,ctrl+v有时又不太合适,这时c++提供了extern"C"来让cpp中的函数以c的形式编译,以下我们看具体用法。
静态库
静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,链接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。
创建静态库的过程如下图(这里我使用的是VS2022)
这里我们可以看到创建的新静态库工程自带有两个头文件和.cpp文件
我们选择将它们删除
然后,将我们所需要的生成的静态库的.c/.cpp和.h头文件加入进来
加入了所需要的生成的静态库的.c/.cpp和.h头文件,进行生成.lib的静态库
这时,解决方案报了一个错
C1010 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"”?
这是因为VS静态库工程中会自动包含"pch.h",而我们需要手动关闭自动包含。
按照下图进行操作
将预编译头设置为 不使用预编译头->应用->确认
这时我们再进行生成.ilb静态库就成功了,并且我们可以在你的工程名目录下的Debug文件夹中找到该lib文件
记住该目录,下面操作还需要用到此目录
链接静态库
由于extern的用法与静态库息息相关,所以我们这里直接举一个.cpp需要调用.c文件中的函数的extern的例子,如果你本来就是.cpp 链接 .cpp的静态库 或者 .c 链接.c的静态库,直接看设置操作,忽略extern的使用即可。
C的编译器去编译c++写的函数代码 本质是因为c++和c的编译器在对函数重命名的命名方式不同。函数名不同,在链接过程中会找不到对应函数的定义,所以会导致报。
而extern的作用就是将c++编译器以c的风格 命名函数
我们先看看C编译器在编译函数对函数重命名的风格
这是C++编译器在编译函数对函数重命名的风格
--------------------------------------------------------------------------------------------------------------------------------
用 extern 在 C++调用C的工程
首先我们先包含静态库的头文件
这里我教大家两种“奇特”的包头文件方式
第一种 是静态库的头文件相对 你现在所写的工程目录比较近 的用法
第二种 就是写绝对路径
然后,我们先随便调用一下 头文件中的函数并且编译
出现报错
我们需要进行一些设置才能真正链接到静态库
找到并选择之前存放.lib的Debug文件夹
应用并确认
还要设置链接器 的 输入
先去Debug文件夹复制.lib文件的全名(包括扩展名)
将.lib的全名粘贴入 附加依赖项 记住加 ;
应用->确定
再进行运行编译,运行成功!
用 extern 在C调用C++的工程
创建静态库和链接静态库的过程和上面一样
但是 C 调用 C++ 的工程需要注意几点
1. C没有 extern的关键字,所以我们只能在C++工程的头文件使用 extern
2.需要注意C++工程的头文件在C文件中展开时,要屏蔽 extern ,因为C没有 extern的关键字
我们可以使用预处理指令来进行屏蔽
预处理指令来控制是否使用extern "C" ,而__cplusplus是只有cpp文件才会有的define定义
这样一来就不存在问题了
链接跟上面是一样的设置过程