C++调用C链接库

C++调用C链接库

  C++调用C语言的链接库,其实相对C调用C++简单。因为C++本来就向下兼容C吧(个人见解)。

  但由于编译器的设计不同,会出现一些问题,如下:(如中间部分,有一句undefined reference to 'helloC()'  ,helloC()是我在C链接库中的函数)

简单说来原因就是未经处理的C代码编译后函数名可能变为_helloC()之类的,而C++编译后函数名却不是这样,所以就对不上。

详细解释见http://www.cnblogs.com/kenkofox/archive/2009/11/05/1597053.html

需要在include C的文件的时候加上extern "c"

  在练习中,写了三个文件:c.h  c.c  cpp.cpp 前两个编译为C链接库,cpp.cpp使用C。验证了C++可以访问到C的全局变量。

  c.h:

#include "stdio.h"
void helloC();
int abc = 1;

  c.c:

#include <stdio.h>
#include "c.h"
void helloC(){
printf("I am Kenko");
}

  cpp.cpp:(重点在于如何include)

#include <iostream>
using namespace std;
extern "C" {
#include "c.h"
}
int main(){
helloC();
cout<<abc<<endl;
return 0;
}

  至于编译:

  1.链接库:gcc -shared -o libccall.so c.c

  2.编译cpp.cpp:g++ cpp.cpp ./libccall.so

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习之路

09 Spring框架 AOP (二) 高级用法

上一篇文章我们主要讲了一点关于AOP编程,它的动态考虑程序的运行过程,和Spring中AOP的应用,前置通知,后置通知,环绕通知和异常通知,这些都是Spring...

3575
来自专栏小勇DW3

承接上文

前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。 

912
来自专栏向治洪

Android性能优化之TraceView和Lint使用详解

Android lint工具是Android studio中集成的一个代码提示工具,它主要负责对你的代码进行优化提示,包括xml和java文件,很强大。编写完代...

2246
来自专栏GuZhenYin

EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

前言 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不多说,我...

2165
来自专栏bboysoul

使用rvm来管理ruby版本

首先导入秘钥 gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A17031...

683
来自专栏大学生计算机视觉学习DeepLearning

c++ 网络编程(九)TCP/IP LINUX/windows--使用IOCP模型 多线程超详细教程 以及 多线程实现服务端

原文链接:https://www.cnblogs.com/DOMLX/p/9661012.html

902
来自专栏owent

pbc的proto3接入

Protobuf 的 proto3发布也有挺长一段时间了。现在很多新项目慢慢转变用proto3来开发。这篇文章主要记录一下我在给pbc写对proto3支持时的一...

801
来自专栏生信技能树

生信人的linux考试

一、在任意文件夹下面创建形如 1/2/3/4/5/6/7/8/9 格式的文件夹系列。 二、在创建好的文件夹下面,比如我的是 /Users/jimmy/tmp/1...

3747
来自专栏服务端技术杂谈

结合Spring容器启动做IOC

641
来自专栏智能大石头

【求助】小系统组成大系统所遇到的问题

    以下只是举例! 环境:     1,通用实体库CommonEntity,里面有管理员类 class Administrator<TEntity> : ...

3528

扫码关注云+社区