C ++如何从dll导出静态类成员?

时间:2015-04-21 12:38:28

标签: c++ windows dll

// API mathAPI.h,Dll.cpp和Test.cpp

#ifdef __APIBUILD
#define __API __declspec(dllexport)
//#error __APIBUILD cannot be defined.
#else
#define __API __declspec(dllimport)
#endif

class math
{
 public:
   static __API double Pi;
   static __API double Sum(double x, double y);
};

//定义了Dll.cpp __APIBUILD

#include "mathAPI.h"

double math::Pi = 3.14;

double math::Sum(double x, double y)
{
  return x + y;
}

// Test.cpp __APIBUILD未定义

#include <iostream>
#pragma comment(lib, "dll.lib")
#include "mathAPI.h"

int main()
{
  std::cout << math::Pi; //linker error
  std::cout << math::Sum(5.5, 5.5); //works fine
  return 0;
}

错误1错误LNK2001:未解析的外部符号&#34; public:static double Math :: Pi&#34; (?裨@ @@数学2NA)

我如何让这个工作?

2 个答案:

答案 0 :(得分:3)

获取Pi值的更好解决方案是创建一个静态方法来初始化并返回它,如DLL.cpp中的以下内容:

#include "mathAPI.h"

// math::getPi() is declared static in header file
double math::getPi()
{
    static double const Pi = 3.14;
    return Pi;
}

// math::Sum() is declared static in header file
double math::Sum(double x, double y)
{
  return x + y;
}

这会阻止你获得未初始化的值Pi,并且会做你想做的事。

请注意,初始化所有静态值/成员的最佳做法是在函数/方法调用中初始化它们。

答案 1 :(得分:0)

而不是逐个导出成员,export whole class。另外,我完全不知道这段代码是如何工作的 - 你没有提供sum()(缺少类范围操作符)的定义以及链接器应该抱怨的内容(而不是math::Sum(),您定义了新的全局sum())。

<强> mathAPI.h

#ifdef __APIBUILD
#define __API __declspec(dllexport)
#else
#define __API __declspec(dllimport)
#endif

class __API math //Add __API to export whole class
{
 public:
   static double Pi;
   static double Sum(double x, double y);
};

<强> Dll.cpp

#include "mathAPI.h"

double math::Pi = 3.14;

double math::Sum(double x, double y) //You missed 'math::' here before
{
  return x + y;
}

就是这样。


修改

但是你应该仍然会收到错误。那是因为你写了一个错字,我没有注意到(你没有发布真正的代码!)。在Dll.cpp中,您写道:

double math::Pi = 3.14;

虽然您发布了一些不同的内容,但我确信您的类名为Math,而不是math,因为链接器正在尝试搜索:

?Pi@Math@@2NA

所以它正在上课Math。这是最可能的猜测。虽然,我很确定,你没有发布真正的代码,而是手写的代码片段。