// 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)
我如何让这个工作?
答案 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
。这是最可能的猜测。虽然,我很确定,你没有发布真正的代码,而是手写的代码片段。