关于extern “C“

首先说明linux下生成静态链接库libxxx.a和动态链接库libxxx.so
假设现在有func.h以及其中函数的实现文件func.cpp

静态库.a :ar -rcs libfunc.a func.cpp
动态库.so : g++ -fpic -shared func.cpp -o libfunc.so

gcc和g++会优先搜索.so,其次寻找.a

为了解释extern "C"需要用到工具反汇编工具objdump, 使用objdump -t *查看符号表

utils.h

int func(int, int);

utils.cpp

#include "utils.h"
int func(int a, int b){
	return a + b;
}

main.cpp

#include <iostream>
#inlcude "utils.h"

int main(){
	std::cout << func(12, 12) <<< std::endl;
	return 0;
}

使用g++编译

g++ -c utils.cpp -o utils.o生成utils.o;再使用objdump查看符号表
在这里插入图片描述
可以看出int func(int, int)函数的符号表为_Z4funcii:其中_Z为前缀,4表示函数名有几个字符,后面紧跟函数名func;之后的ii为参数类型。由此可以看出c++通过此种方式支持函数重载,并且符号表中并没有对返回值类型进行体现,由此可以得出int func(int, int)和函数void func(int, int)不能构成函数重载。

接下来看看如果使用extern "C"标记,产生的符号表
修改utils.h文件

#ifdef __cplusplus
extern "C" {
#endif
	int func(int, int);
#ifdef __cplusplus
}
#endif

使用命令g++ -c utils.cpp生成utils.o文件,并使用objdump查看符号表
在这里插入图片描述
由上可知为什么c语言不支持函数重载,因为在函数的符号表中没有什么用来区分重载函数,而c++可以。
并且,最终对main.cpp进行编译,查看符号表可知,其实main函数是按c语言形式生成符号表,因为目的是为了避免重载。
在这里插入图片描述
通常在使用静态和动态链接库时需要使用extern "C"

参考链接:

为什么需要 extern “C” ?
如何从C中调用C++函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值