【发布时间】: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/…