本文转自 http://www.cublog.cn/u3/99982/showart_2054844.html

(最好用g++编译,我在自己的项目中使用,使用gcc碰到过一个莫名其妙的问题)

(上面的奇妙问题,好像是在C里面包含了c++的头文件所引起的,后来不包含这个头文件,而使用extern声明头文件中的函数就可以了。)

C一般不能直接调用C++函数库,需要将C++库封装成C接口后,才可以使用C调用。

下面举例,说明一个封装策略:

//code in add.cxx

#include "add.h"

int sample::method()

{

cout<

}

//code in add.h

#include

using namespace std;

class sample

{

public:

int method();

};

将上面的两个文件生成动态库libadd.so放到 /usr/lib目录下,编译命令如下:

sudo g++ -fpic -shared -g -o /usr/lib/libadd.so add.cxx -I ./

由于在C中不能识别类,所以要将上面类的成员函数,要封装成C接口函数才能被调用。下面进行封装,将输出接口转换成C接口。

//code in mylib.cxx

#include "add.h"

#ifndef _cplusplus

#define _cplusplus

#include "mylib.h"

#endif

int myfunc()

{

sample ss;

ss.method();

return 0;

}

//code in mylib.h

#ifdef _cplusplus

extern "C"

{

#endif

int myfunc();

#ifdef _cplusplus

}

#endif

在linux下,gcc编译器并没用变量_cplusplus来区分是C代码还是C++ 代码(没有宏定义),如果使用gcc编译器,这里我们可以自己定义一个变量_cplusplus用于区分C和C++代码,所以在mylib.cxx中定义了一个变量_cplusplus用于识别是否需要“extern "C"”将函数接口封装成C接口。但是如果使用g++编译器则不需要专门定义_cplusplus,编译命令如下:

g++ -fpic -shared -g -o mylib.so mylib.cxx -la -I ./

main.c

#include

#include

#include "mylib.h"

int

main()

{

int (*dlfunc)();

void *handle; //定义一个句柄

handle = dlopen("./mylib.so", RTLD_LAZY);//获得库句柄

dlfunc = dlsym(handle, "myfunc"); //获得函数入口

(*dlfunc)();

dlclose(handle);

return 0;

}

编译命令如下:

gcc -o main main.c ./mylib.so -ldl

下面就可以执行了。

需要说明的是,由于main.c 和 mylib.cxx都需要包含mylib.h,并且要将函数myfunc封装成C接口函数输出需要“extern "C"”,而C又不识别“extern "C"”,所以需要定义_cplusplus来区别处理mylib.h中的函数myfunc。

在main.c的main函数中直接调用myfunc()函数也能执行,这里介绍的是常规调用库函数的方法。

linux c 调用c程序,Linux C调用C++库(用C封装C++接口)相关推荐

  1. java打印堆栈信息linux,在C/C++程序里打印调用栈信息(转载)

    原文出处  http://blog.csdn.net/yetyongjin/article/details/7759144 以下不能windows + mingw下执行.  windows下参考 ht ...

  2. linux如何调试elf程序,Linux应用程序elf描述

    玩Linux的人应该明白ELF文件是一种文件格式,就好比.txt,.doc等一样,只是这个文件是按照特定信息排列组成,同样在windows上也存在一种格式,它叫PE,老的叫dos.下面我就来看看ELF ...

  3. linux 中断 c语言程序,linux驱动之中断处理过程C程序部分

    当发生中断之后,linux系统在汇编阶段经过一系列跳转,最终跳转到asm_do_IRQ()函数,开始C程序阶段的处理.在汇编阶段,程序已经计算出发生中断的中断号irq,这个关键参数最终传递给asm_d ...

  4. linux如何调试elf程序,Linux下ELF的执行过程

    我们考虑从shell中执行一个Linux应用程序,并且该应用程序链接的是动态库,而不是静态库 1. 加载二进制文件 shell会执行evecve()进行系统调用,如下所示 execve() -> ...

  5. 怎么用linux设计一个小程序,“Linux”小程序发布一个月后,我们发现了什么

    原标题:"Linux"小程序发布一个月后,我们发现了什么 这一个月来,这个小程序得到了八千多人的使用,一百多位贡献者实际参与了翻译贡献,其中贡献最高的"Datura st ...

  6. linux系统udp通信程序,Linux UDP socket编程(UDP通讯模型) | C/C++程序员之家

    Linux UDP socket编程(UDP通讯模型): UDPClient + UDPService. Linux下大多数网络程序都是基于TCP的,很少基于UDP,简单的通讯模型如下,开发时候备用! ...

  7. linux如何运行java程序,Linux环境下运行简单java程序

    一.安装java 1.下载jdk8 选择对应jdk版本下载.(Tips:可在Windows下载完成后,通过FTP或者SSH到发送到Linux上) 2. 登录Linux,切换到root用户 su roo ...

  8. matlab vb调用,VB程序中实现调用MATLAB的方法

    收稿日期:2000207227 作者简介:王跃强(1978-),男,硕士研究生,主要研究方向:光电检测及其自动化. 文章编号:1001-9081(2001)02-0095-02 VB 程序中实现调用M ...

  9. vb.net 调用matlab程序 绘图,vbnet调用matlab

    \\然后参考该 类库的文档,在类里引用 matlab 的命名空间 装 matlab ,添加引用[VB.Net] Matlab = CreateObject("matlab.applicati ...

  10. linux系统的gui程序,Linux GUI子系统概述 GUI子系统的构成及工作流程

    作者:Nick 开始前的几点说明: 本文会尽量从初学者的角度去描述整个Linux整个图形子系统,但由于其复杂性,涉及到的模块比较多,可能会需要一些相关的先验知识: 对于系统的介绍,分析的着重点可能不会 ...

最新文章

  1. 理清fineuploader无刷新上传的一些事
  2. 非线性振动 matlab,用MATLAB分析非线性弹簧振子的振动
  3. mysql安装可能遇到的错误和安装过程
  4. 绘制颜色渐变矩形函数
  5. POJ 1696 Space Ant(极角排序)【计算几何】
  6. NAT类型及检测方法
  7. SQL2005中row_number()等函数的用法
  8. bigdecimal不保留小数_为什么 0.1 + 0.2 = 0.3,原来你不知道
  9. 【人工智能】计算机审美,学的怎么样了?
  10. AWS Fargate告诉你:什么是容器即服务
  11. DIV+CSS布局的几点建议
  12. storyboard用代码跳转
  13. Android Studio实现音乐播放器2.0
  14. SimpleDateFormat关于时间类的一些常用处理
  15. *第六周*数据结构实践项目一【建立顺序栈算法库】
  16. wpf DoEvents 用法原理存在的坑推荐方法
  17. (二)智能化技术如何赋能能源数字化转型及智慧化应用?
  18. 苹果MFI认证步骤汇总
  19. 【新书推荐】Interpretable Machine Learning with Python
  20. 智能急救站入驻公共场所,搭起生命安全新防线

热门文章

  1. java类后面的尖括号_泛型 - Java中的T(尖括号)是什么意思?
  2. 如何删除git本地分支
  3. 你对Redis持久化了解多少?一篇文章让你明白Redis持久化
  4. 研磨设计模式学习笔记1--简单工厂(SimpleFactory)
  5. 《HTML与CSS入门经典(第8版)》——2.5 测试Web内容
  6. [leetcode] Sudoku Solver
  7. practice:win2008 core基本管理(一)
  8. ASP.NET2.0下使用AJAX调用Webservice的方法
  9. wordpress如何去掉顶部工具条
  10. 为什么训练时测试准确率大幅度波动_Nature Mach Intell|类药性预测准确率有极限...