如果你有一个c++做的动态链接库.so文件,而你只有一些相关类的声明, 那么你如何用c调用呢,别着急,本文通过一个小小的例子,让你能够很爽的搞定.

一、编译生成一个供测试使用的C++动态库:

链接库头文件:
//head.h

class A
{
public:A();virtual ~A();int gt();int pt();
private:int s;
};

//firstso.cpp

#include <iostream>
#include "head.h"A::A(){}
A::~A(){}
int A::gt()
{s=10;
}
int A::pt()
{       std::cout<<s<<std::endl;
}

动态库编译命令如下:
g++ -shared -o libmy.so firstso.cpp

有时会报错并提示加上-fPIC参数,加上即可:

g++ -fPIC -shared -o libmy.so firstso.cpp
这时候生成libmy.so文件,将其拷贝到系统库里面:/usr/lib/或配置到LD_LIBRARY_PATH

或者

生成静态库,静态库编译命令如下:

g++ -c firstso.cpp

ar -rc libmy.a libmy.so

这时候生成libmy.a文件,待下一步使用。

二、对C++动态库里的接口进行二次封装:
//secso.cpp

#include <iostream>
#include "head.h"
extern "C"
{
int f();
int f()
{A a;a.gt();a.pt();return 0;
}
}

编译命令:

使用动态库:
gcc -shared -o sec.so secso.cpp -L. -lmy

或者

使用静态库:

gcc -shared -o sec.so secso.cpp libmy.a
这时候生成第二个.so文件,此时库从一个类变成了一个c的接口.

备注:

在使用嵌入式编译器移植的时候,使用了xxxx-gcc编译出来的第二个.so文件,移植后dlopen会出现

undefined symbol: _ZTVN10_cxxabiv120__si_class_type_infoE

的错误。将xxxx-gcc改为xxxx-g++生成的第二个.so文件,移植后则能正常运行。

C程序调用接口:

下面开始调用:
//test.c

#include "stdio.h"
#include "dlfcn.h"#define SOFILE "sec.so"int (*f)();
int main()
{void *dp;dp=dlopen(SOFILE,RTLD_LAZY);f=dlsym(dp,"f");f();return 0;
}

编译命令如下:
 gcc -o myapp test.c  -ldl

运行

先将libmy.so加入到环境变量LD_LIBRARY_PATH:

如libmy.so在tmp目录

export LD_LIBRARY_PATH=/tmp:$LD_LIBRARY_PATH

./myapp
10

Linux 中C文件调用C++代码的方法(静态库)

如何一个C语言的工程中调用C++写成的代码呢?最简单的方法当然是使用g++编译C工程,但有时候可能因为一些限制不能使用g++编译,这时候可以考虑把C++代码Make成一个静态库,再在C代码中调用。具体做法如下:
假设有一个类文件如下:

//MyClass.cpp

class MyClass
{
public:
    int add(int a, int b)
       {
              return (a + b);
       }
};

我们首先将该类的方法进行包装,形成类似C语言的库函数。

//output c function
extern "C" int test_add(int a, int b);
void test_add(int a, int b)
{
 MyClass h;
 return h.add(a, b);
}

使用如下命令对上面的MyClass.cpp进行编译,并生成归档文件:
g++ -c MyClass.cpp
ar crv libMyClass.a MyClass.o

在C语言中调用该函数方法:

//test.c

#include <stdio.h>

extern int test_add(int a,int b);

int main()
{
 printf("2 + 4 = %d\n", test_add(2, 4));
 return 0;
}

使用如下命令编译该文件:
gcc -o test test.c libMyClass.a -lstdc++

其中-lstdc++ 所对应的是标准C++库

Linux C语言调用C++动态链接库-改相关推荐

  1. Linux C语言调用C++动态链接库

    Linux C语言调用C++动态链接库 标签: C调用C++库 2014-03-10 22:56 3744人阅读 评论(0) 收藏 举报 分类: [Linux应用开发](48) 版权声明:本文为博主原 ...

  2. C语言调用C++动态链接库

    C调用C++接口,这个问题的解决和C++调用C动态链接库是类似的.话不多说,直接上例子来进行说明. helloworld_cpp.h文件 #include<iostream> using ...

  3. linux C语言调用Intel处理器CPUID指令的实例

    在之前写的文章中,仅简单讲了一下CPUID指令,通过该指令可以获取很多和处理器相关的信息,如处理器的系列.型号.内存地址是多少位,等等.本文在Linux环境下,使用C语言内嵌汇编的手段使用CPUID指 ...

  4. 【转】Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现

    转自:Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现_Jaster_wisdom的专栏-CSDN博客 之前在这里和这里调用了matlab自带的一些函数,是通过matl ...

  5. c++与fortran混合语言编程中动态链接库的调用,[转载]C++与Fortran混合语言编程中动态连接库的调用...

    摘 要:介绍了C++和Fortran 90混合语言编程中,在C++中调用Fortran动态连接库(DLL,Dynamic Link Library)的方法以及参量传递.函数调用等的方法. 关键词:混合 ...

  6. c/c++编写dll供其他语言调用

    范例 就以md5为例吧,首先去github搜索md5,选一个用c或者c++写的md5. 比如:https://github.com/chinaran/Compute-file-or-string-md ...

  7. Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一)

    Java通过JNI调用C++动态链接库dll,并打在jar包内--JNA-JNI(一) 系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 --JNA-JNI(一) Java使 ...

  8. Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本

    Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本 首先参考http://wiki.chumby.com/index.php?title=Lua&print ...

  9. linux C语言多线程库pthread中条件变量的正确用法逐步详解

    linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...

最新文章

  1. 海思3559A上编译LIVE555源码操作步骤
  2. 腾讯云TDSQL-A发布公有云版本 支持第七次全国人口普查等海量数据场景
  3. 一种基于三代PacBio测序数据的补洞方法
  4. PowerDesigner逆向生成
  5. android 模拟飞行,安卓版模拟飞行 X Plane 9试玩
  6. TensorFlow随笔-多分类单层神经网络softmax
  7. kali NETCAT NC的使用
  8. 详细bugfree使用教程网址
  9. PyTorch 搭建神经网络 (MNIST)[含注释]
  10. 识别和追踪主题层次的影响力者(来自2018 Machine Learning 论文学习笔记)
  11. matlab视频旋转振动,基于MATLAB的振动合成及左旋与右旋的动态模拟演示
  12. Eclipse运行程序报错: Errors running builder ‘Integrated External Tool Builder‘ on project
  13. 前端开发那些不常见但十分有效的小玩意
  14. 上海公布第二阶段自动驾驶开放测试道路,近90家企业申请牌照
  15. 〖Python 数据库开发实战 - MySQL篇⑤〗- 为大家推荐几款经典的数据库可视化工具
  16. thinkphp 下实现繁简体汉字转换
  17. IDEA提高运行速度
  18. login登录服务器
  19. Oracle物化视图与物化视图日志
  20. Solidworks异型孔打孔失败原因分析

热门文章

  1. Springboot项目中使用Kafka
  2. 可持续集成(devops)工具盘古入门指南
  3. web漏洞-远端WWW服务支持TRACE请求
  4. 无人机倾斜摄影全景建模三维数字沙盘电子沙盘人工智能开发教程视频第7课
  5. Python多进程4 进程池——Pool
  6. 招到不能胜任工作岗位的人,责任在不在HR?
  7. 【python-docx】长度单位(毫米、厘米、英尺、磅等)的表示和转换关系
  8. 一加7T可以刷鸿蒙系统吗,一加7T最新系统升级刷机包(官方刷机固件完整rom包公测版第九版)...
  9. oracle报错——字符集不匹配
  10. 关于MySql的Unhandled异常