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

C++: class in dynamic .so library

本文关键字:so 动态 C++      更新时间:2023-10-16

所以,我最近遇到了很大的问题。在我的工作项目中,我收到一个 json 文件,并且会有一些实现一些方程的库名称。我的老板希望在 .so 文件中必须是类而不是某个过程。所以我根据这个C++编写代码:在单独的共享库中实现类方法

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()
            ^

如果有人能告诉我我在哪里犯了错误,我将不胜感激。当我只使用外部"c"双计算等程序时,它工作正常,但是当我重写到课堂时,它只是打我的脸......

和模型.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 */

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

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

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

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

如果你看这个例子:http://ideone.com/TpwcZa 你可以看到,它只有在你添加 =0 时才编译。

(此处的工作代码:http://ideone.com/K5zdDy)

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

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