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 条评论
登录 后参与评论

相关文章

来自专栏技术博客

MVC项目开发中那些用到的知识点(WCF Rest在MVC项目中的两种调用方式)

 接口的实现还添加[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibility...

852
来自专栏小灰灰

Java实现几种简单的重试机制

背景 当业务执行失败之后,进行重试是一个非常常见的场景,那么如何在业务代码中优雅的实现重试机制呢? 设计 我们的目标是实现一个优雅的重试机制,那么先来看下怎么...

2K8
来自专栏向治洪

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

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

2376
来自专栏小勇DW3

承接上文

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

1192
来自专栏bboysoul

使用rvm来管理ruby版本

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

953
来自专栏Java学习之路

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

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

3695
来自专栏智能大石头

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

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

3608
来自专栏潇涧技术专栏

Head First Systrace

深入浅出systrace(1)systrace的简单介绍和systrace工具源码分析。

1531
来自专栏生信技能树

生信人的linux考试

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

3947
来自专栏GuZhenYin

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

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

2235

扫码关注云+社区