【问题标题】:C++: class in dynamic .so libraryC++:动态 .so 库中的类
【发布时间】: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/…

标签: c++ class dynamic


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多