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++如何直接调用自己写的类中的函数,就像调用标准库中的函数那样

在 C++ 中的类中创建类对象的动态数组

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )

为啥在 C++ 中的类中不需要“&”引用?

C++ 与类中的成员相同的类