gpt4 book ai didi

c++ - 在 C++ DLL 项目中使用 STL

转载 作者:行者123 更新时间:2023-11-30 04:14:42 26 4
gpt4 key购买 nike

我正在尝试编写一个简单的应用程序来熟悉 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项目很陌生,所以请原谅我的无知。我可以知道我错了什么吗?

非常感谢。

============================================= ==============

编辑1:

我认为给出一个大图可能更容易找到答案。我打算编写一些 .dll 文件并从 Python 代码中调用它们。正如@Chad 建议的那样,采用上述方法并不是一个好主意,因为它会迫使用户(也就是我)使用与 STL 相同的实现。

那请问,为了实现我的计划,有没有更好的方法呢?

非常感谢。 :)

============================================= ===============

编辑2:

感谢大家的热心帮助。特别感谢@Anodyne。现在 Anodyne 完美地回答了我的起源问题。但是,正如我在 EDIT1 中所说的那样,现在得考虑以后的合作C++ dllPython .

欢迎提出任何建议!再次感谢! :)

PS:我应该为此开一个新线程吗?

最佳答案

我没有尝试编译您的代码,但我发现了一个问题:在 MathFuncsDll.h 中,您将“std::vector”类称为“vector”——这应该是“std: : vector ”。换句话说,MathFuncsDll.h 中的最后一个声明应该如下所示:

    static __declspec(dllexport) double Sumproduct(std::vector<double>* a, std::vector<double>* b);

当然,你可能还有其他问题:-)

关于c++ - 在 C++ DLL 项目中使用 STL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18743494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com