linux下C++调C库,C调C++库

linux下C++调C库,C调C++库

C++调C库

main.cpp

#include "fun.h"

int main()
{
    fun();
}

fun.h

void fun();

fun.c

#include <stdio.h>
#include "fun.h"

void fun()
{
    printf("hello world!\n");
}

编译

1.直接g++编译cpp 和 c文件
在这里插入图片描述
2.将c文件做成动态库然后动态链接
在这里插入图片描述
为何编译不过?
因为C++与C编译不同,C++支持函数重载,所以原来的 fun 在编译时可能会加前缀。C编译后函数名不会变化。所以c++直接使用 c 库的头文件编译会找不到符号。 nm 时names的缩写。可以自己学习
在这里插入图片描述
那么我今天就想用C库改怎么办呢?
这时候 extern “C” 就登场了。他会告诉编译器,编译此处的时候要用C的编译方式来编译。
在这里插入图片描述
直接用C库头文件编译不可得,后来直接修改头文件而不重新编译C库也好用。但是不可取。正常情况应在编译动态库时使用 extern C。

改良版 fun.h

#ifdef __cplusplus
extern "C"{
#endif

void fun();

#ifdef __cplusplus
}
#endif

C 调用C++ 库

函数名在编译时 C 和C++不同 C要用C++,函数名的问题解决起来很麻烦。遂不研究

番外

nm 可以查看符号信息,但是实际工作中项目发布给客户时并不需要带此信息。因此为了节省存储空间都会对项目瘦身。操作如下:

#include <stdio.h>

void fun()
{
	printf("hello woeld\n");
}

int main()
{
	fun();
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值