C ++:动态.so库中的类

时间:2014-11-22 22:57:57

标签: c++ class dynamic

所以,我最近遇到了很大的问题。在我的工作项目中,我收到了一个json文件,并且会有一些名称off库,并带有一些方程式的实现。我的老板希望在.so文件中必须是class而不是某些程序。所以我根据这个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这样的程序时,&#34; c&#34;双重计算等它正常工作,但当我重写课堂时,它只是打我的脸......

和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 */

2 个答案:

答案 0 :(得分:3)

您的班级名为“压力”,但您的enum Model_type也有“压力”。变种。您应该删除此冲突,或添加class说明符:extern "C" class Stress* create()

答案 1 :(得分:2)

压力不是纯虚拟的,也没有实现。

 virtual double calc(model, double, double, double) = 0;

会让它变成纯粹的虚拟。这就是为什么编译器说Stress不命名类型的原因,因为类是不完整的。

如果你看一下这个例子:http://ideone.com/TpwcZa你可以看到,只有你加上= 0才会编译。

(这里的工作代码:http://ideone.com/K5zdDy

根据Keltar的说法:您可以通过两种方式解决与枚举的名称冲突:

  • 重命名
  • 使其成为enum class,它有自己的命名空间。