linux c 调用c程序,Linux C调用C++库(用C封装C++接口)
本文转自 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++接口)相关推荐
- java打印堆栈信息linux,在C/C++程序里打印调用栈信息(转载)
原文出处 http://blog.csdn.net/yetyongjin/article/details/7759144 以下不能windows + mingw下执行. windows下参考 ht ...
- linux如何调试elf程序,Linux应用程序elf描述
玩Linux的人应该明白ELF文件是一种文件格式,就好比.txt,.doc等一样,只是这个文件是按照特定信息排列组成,同样在windows上也存在一种格式,它叫PE,老的叫dos.下面我就来看看ELF ...
- linux 中断 c语言程序,linux驱动之中断处理过程C程序部分
当发生中断之后,linux系统在汇编阶段经过一系列跳转,最终跳转到asm_do_IRQ()函数,开始C程序阶段的处理.在汇编阶段,程序已经计算出发生中断的中断号irq,这个关键参数最终传递给asm_d ...
- linux如何调试elf程序,Linux下ELF的执行过程
我们考虑从shell中执行一个Linux应用程序,并且该应用程序链接的是动态库,而不是静态库 1. 加载二进制文件 shell会执行evecve()进行系统调用,如下所示 execve() -> ...
- 怎么用linux设计一个小程序,“Linux”小程序发布一个月后,我们发现了什么
原标题:"Linux"小程序发布一个月后,我们发现了什么 这一个月来,这个小程序得到了八千多人的使用,一百多位贡献者实际参与了翻译贡献,其中贡献最高的"Datura st ...
- linux系统udp通信程序,Linux UDP socket编程(UDP通讯模型) | C/C++程序员之家
Linux UDP socket编程(UDP通讯模型): UDPClient + UDPService. Linux下大多数网络程序都是基于TCP的,很少基于UDP,简单的通讯模型如下,开发时候备用! ...
- linux如何运行java程序,Linux环境下运行简单java程序
一.安装java 1.下载jdk8 选择对应jdk版本下载.(Tips:可在Windows下载完成后,通过FTP或者SSH到发送到Linux上) 2. 登录Linux,切换到root用户 su roo ...
- matlab vb调用,VB程序中实现调用MATLAB的方法
收稿日期:2000207227 作者简介:王跃强(1978-),男,硕士研究生,主要研究方向:光电检测及其自动化. 文章编号:1001-9081(2001)02-0095-02 VB 程序中实现调用M ...
- vb.net 调用matlab程序 绘图,vbnet调用matlab
\\然后参考该 类库的文档,在类里引用 matlab 的命名空间 装 matlab ,添加引用[VB.Net] Matlab = CreateObject("matlab.applicati ...
- linux系统的gui程序,Linux GUI子系统概述 GUI子系统的构成及工作流程
作者:Nick 开始前的几点说明: 本文会尽量从初学者的角度去描述整个Linux整个图形子系统,但由于其复杂性,涉及到的模块比较多,可能会需要一些相关的先验知识: 对于系统的介绍,分析的着重点可能不会 ...
最新文章
- 理清fineuploader无刷新上传的一些事
- 非线性振动 matlab,用MATLAB分析非线性弹簧振子的振动
- mysql安装可能遇到的错误和安装过程
- 绘制颜色渐变矩形函数
- POJ 1696 Space Ant(极角排序)【计算几何】
- NAT类型及检测方法
- SQL2005中row_number()等函数的用法
- bigdecimal不保留小数_为什么 0.1 + 0.2 = 0.3,原来你不知道
- 【人工智能】计算机审美,学的怎么样了?
- AWS Fargate告诉你:什么是容器即服务
- DIV+CSS布局的几点建议
- storyboard用代码跳转
- Android Studio实现音乐播放器2.0
- SimpleDateFormat关于时间类的一些常用处理
- *第六周*数据结构实践项目一【建立顺序栈算法库】
- wpf DoEvents 用法原理存在的坑推荐方法
- (二)智能化技术如何赋能能源数字化转型及智慧化应用?
- 苹果MFI认证步骤汇总
- 【新书推荐】Interpretable Machine Learning with Python
- 智能急救站入驻公共场所,搭起生命安全新防线
热门文章
- java类后面的尖括号_泛型 - Java中的T(尖括号)是什么意思?
- 如何删除git本地分支
- 你对Redis持久化了解多少?一篇文章让你明白Redis持久化
- 研磨设计模式学习笔记1--简单工厂(SimpleFactory)
- 《HTML与CSS入门经典(第8版)》——2.5 测试Web内容
- [leetcode] Sudoku Solver
- practice:win2008 core基本管理(一)
- ASP.NET2.0下使用AJAX调用Webservice的方法
- wordpress如何去掉顶部工具条
- 为什么训练时测试准确率大幅度波动_Nature Mach Intell|类药性预测准确率有极限...