C++:动态 .so 库中的类
Posted
技术标签:
【中文标题】C++:动态 .so 库中的类【英文标题】:C++: class in dynamic .so library 【发布时间】:2014-11-22 22:57:56 【问题描述】:所以,我最近遇到了很大的问题。在我的工作项目中,我收到了一个 json 文件,其中将有一个带有一些方程式实现的名称库。我的老板希望 .so 文件中的内容必须是类而不是某些程序。所以我按照这个C++: implementation of a class methods in a separated shared library写代码
Stress.h
#ifndef STRESS_H
#define STRESS_H
#include "Model.h"
class Stress
public:
virtual double calc(model, double, double, double);
;
#endif /* STRESS_H */
和 .cpp 文件
Stress.cpp
#include <math.h>
#include <iostream>
#include "Model.h"
#include "Stress.h"
class Hans_S : public Stress
public:
model m;
double Temperature;
double E;
double Edot;
virtual double calc(model, double, double, double);
;
double Hans_S::calc(model m, double E, double Edot, double T)
double s;
s = m.params[0] * pow(E,m.params[1]) * exp(((-(m.params[2]))*E)) * pow((Edot),m.params[3]) * exp(((-(m.params[4])) * (T/1000)));
return s*pow(10,6);
extern "C" Stress* create()
return new Hans_S();
当我像这样编译 .cpp 文件时
g++ -fPIC -shared Stress.cpp -o Stress.so
我收到了这个错误
Stress.cpp:25:12: error: ‘Stress’ does not name a type
extern "C" Stress* create()
^
如果有人能告诉我哪里出错了,我将不胜感激。当我使用 extern "c" double calc 等程序时,它可以正常工作,但是当我改写上课时,它只会打我的脸...
Model.h 看起来像这样
#ifndef MODEL_H
#define MODEL_H
using namespace std;
enum Model_type
Stress = 0,
Strain,
S_recrystalization,
D_recrystalization,
G_growth
;
struct model
string name;
Model_type type;
double *params;
;
#endif /* MODEL_H */
【问题讨论】:
为什么extern "C"
,而不仅仅是extern
,如果你到处都有纯c++?此外,除了提供单例共享全局之外,使用静态工厂 API 可能是更好的选择,以便从共享库中获取实例。
我根据该链接使用extern "C"
,所以当我在代码中使用 dlopen 时,我可以找到正确的名称,如果我没记错的话,c++ 正在向函数名称添加随机字符。我对吗?顺便说一句,抱歉英语不好......这只是来自 60 小时的课程和游戏......
'extern "C"' 但返回 'class Stress*'?对我来说听起来很奇怪。你试过把“class”放在“Stress*”之前吗?
Keltar 发现了我认为的主要问题,我也会听从 thi gg 的建议,我仍然对你想要达到的目标感到有点困惑,这个问题更像是一个代码审查/修复我强烈建议退后一步,可能阅读:akkadia.org/drepper/dsohowto.pdf 并提出更具体的问题,例如“如何使用 C++ 接口将 json 包装在 .so 中”
这种听起来也像 node.js 的倒序。你确定你听错了吗?如果截止日期真的那么紧,我只是不希望你走错路benfarrell.com/2013/01/03/…
【参考方案1】:
您的班级名为“压力”,但您的enum Model_type
也有“压力”变体。您应该删除此冲突,或添加 class
说明符:extern "C" class Stress* create()
。
【讨论】:
【参考方案2】:压力不是纯虚拟的,也没有实现它。
virtual double calc(model, double, double, double) = 0;
将使其成为纯虚拟的。这就是为什么编译器说 Stress 没有命名类型的原因,因为类是不完整的。
如果您查看此示例:http://ideone.com/TpwcZa,您会看到,只有添加 =0 才能编译。
(此处的工作代码:http://ideone.com/K5zdDy)
根据 Keltar:您可以通过 2 种方式解决与枚举的名称冲突:
重命名 将其设为具有自己命名空间的enum class
。
【讨论】:
以上是关于C++:动态 .so 库中的类的主要内容,如果未能解决你的问题,请参考以下文章
c++如何直接调用自己写的类中的函数,就像调用标准库中的函数那样
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )