C++:动态 .so 库中的类
C++: class in dynamic .so library
所以,我最近遇到了很大的问题。在我的工作项目中,我收到一个 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
。
相关文章:
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 如何使用ndk-build.cmd构建Android.so文件
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 减小 opencv4 动态库 .so 的大小
- 创建.so时绑定动态库
- 为什么动态链接的二进制显示硬编码为so name
- 如何在使用旧版本gcc的系统上动态链接到libc.so.6、libstdc++.so.6的本地副本
- C++:动态 .so 库中的类
- -finstrument-functions 不适用于动态加载的 g++ 共享对象 (.so)
- 使用-static libgcc-static libstdc++编译仍然会导致对libc.so的动态依赖
- 依赖地狱:linux.so插件动态加载
- Callgrind在动态加载的SO中看不到源代码
- 在c++程序中如何调用动态库中c++类的构造函数(.so)