您的位置:首页 > 编程语言 > C语言/C++

如何用c语言调用c++做成的动态链接库

2017-02-22 15:41 183 查看
转自:http://blog.csdn.net/jiangwei0910410003/article/details/39312947

今天在做东西的时候遇到一个问题,就是如何在C语言中调用C++做的动态链接库so文件

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

链接库头文件:
head.h

[cpp] view
plain copy

class A  

{  

        public:  

        A();  

        virtual ~A();  

        int gt();  

        int pt();  

private:  

        int s;  

};  

firstso.cpp

[cpp] view
plain copy

#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

这时候生成libmy.so文件,将其拷贝到系统库里面:/usr/lib/

进行二次封装:

secso.cpp

[cpp] view
plain copy

#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

这时候生成第二个.so文件,此时库从一个类变成了一个c的接口.

拷贝到/usr/lib

下面开始调用:
test.c

[cpp] view
plain copy

#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 -rdynamic -s -o myapp test.c

运行Z$./myapp
10
源码下载(window右键另存为zip):

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: