我正在尝试编写一个简单的应用程序来熟悉C ++中的dll项目。我首先在MSDN上关注了这个例子:http://msdn.microsoft.com/en-us/library/ms235636(v=vs.90).aspx
效果很好,所以我又向前迈了一步。这是我的代码:
// MathFuncsDll.h
#include <vector>
namespace MathFuncs
{
// This class is exported from the MathFuncsDll.dll
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);
// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws const std::invalid_argument& if b is 0
static __declspec(dllexport) double Divide(double a, double b);
static __declspec(dllexport) double Sumproduct(vector<double>* a, vector<double>* b);
// **Here I use std::vector**
};
}
在MathFuncsDll.cpp
:
// MathFuncsDll.cpp : Defines the exported functions for the DLL application.
#include "stdafx.h"
#include "MathFuncsDll.h"
#include <stdexcept>
#include <vector>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw invalid_argument("b cannot be zero!");
}
return a / b;
}
// **Here is the definition of Sumproduct**
double MyMathFuncs::Sumproduct(vector<double>* a, vector<double>* b)
{
int size1 = a->size(), size2 = b->size();
if(size1 != size2)
{
throw invalid_argument("The length of input vectors should be the same!");
}
double sum = 0;
for(int i = 0; i < size1; i++)
sum += a->at(i) * b->at(i);
return sum;
}
}
在main
:
// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib
#include <iostream>
#include "MathFuncsDll.h"
using namespace std;
int main()
{
double a = 7.4;
int b = 99;
cout << "a + b = " <<
MathFuncs::MyMathFuncs::Add(a, b) << endl;
cout << "a - b = " <<
MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MyMathFuncs::Divide(a, b) << endl;
try
{
cout << "a / 0 = " <<
MathFuncs::MyMathFuncs::Divide(a, 0) << endl;
}
catch (const invalid_argument &e)
{
cout << "Caught exception: " << e.what() << endl;
}
system("pause");
return 0;
}
当我尝试使用VS2012构建解决方案时,它会提供以下错误消息
error C2511: 'double MathFuncs::MyMathFuncs::Sumproduct(std::vector<_Ty> *,std::vector<_Ty> *)' : overloaded member function not found in 'MathFuncs::MyMathFuncs'
error C2061: syntax error : identifier 'vector'
我是dll项目的新手,所以请原谅我的无知。我可以知道我错了吗?
非常感谢提前。
=============================================== ==============
EDIT1:
我认为通过全局了解可能更容易找到答案。我打算编写一些.dll文件并从Python代码中调用它们。正如@Chad所建议的那样,在上述方法中做这不是一个好主意,因为它会迫使用户(我是)使用与STL相同的实现。
然后,我可以知道,为了实现我的计划,是否有更好的方法来做到这一点?
非常感谢你。 :)
=============================================== ===============
EDIT2:
感谢所有人的帮助。特别感谢@Anodyne。现在,Anodyne完全回答了我的原始问题。但是,正如我在EDIT1
中所述,现在我必须考虑C++ dll
和Python
之间未来的合作。
欢迎任何建议!非常感谢! :)
PS:我应该为此开一个新线程吗?
答案 0 :(得分:1)
我没有尝试编译你的代码,但我发现了一个问题:在MathFuncsDll.h中,你将“std :: vector”类称为“vector” - 这应该是“std: :向量”。换句话说,MathFuncsDll.h中的最后一个声明应如下所示:
static __declspec(dllexport) double Sumproduct(std::vector<double>* a, std::vector<double>* b);
当然,您可能还有其他问题: - )
答案 1 :(得分:1)
Boost.Python似乎正是您正在寻找的。我自己没有尝试过(不是Pythonista),但是我一直使用其他Boost库,而且它们都很棒。