【发布时间】:2011-01-13 02:04:43
【问题描述】:
我有以下 C++ 代码来制作 dll (Visual Studio 2010)。
class Shape {
public:
Shape() {
nshapes++;
}
virtual ~Shape() {
nshapes--;
};
double x, y;
void move(double dx, double dy);
virtual double area(void) = 0;
virtual double perimeter(void) = 0;
static int nshapes;
};
class __declspec(dllexport) Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) { };
virtual double area(void);
virtual double perimeter(void);
};
class __declspec(dllexport) Square : public Shape {
private:
double width;
public:
Square(double w) : width(w) { };
virtual double area(void);
virtual double perimeter(void);
};
我有 __declspec,
class __declspec(dllexport) Circle
我可以使用以下命令构建一个 dll
CL.exe /c example.cxx
link.exe /OUT:"example.dll" /DLL example.obj
当我尝试使用该库时,
Square* square; square->area()
我收到了错误消息。 有什么问题或遗漏?
example_unittest.obj:错误 LNK2001:未解析的外部符号“公共:虚拟双 __thiscall ... Square::area(void)" (?area@Square@@UAENXZ)添加
根据wengseng的回答,我修改了头文件,对于DLL C++代码,我添加了
#define XYZLIBRARY_EXPORT
但是,我仍然遇到错误。
已解决
对于链接example.dll的主程序,我没有链接example.lib。
cl /MD /EHsc gtest_main.cc example_unittest.cc /I"./include" /link /libpath:"./lib" /libpath:"." gtest_md.lib example.lib /out:gtest_md_release.exe
添加后,一切正常。
【问题讨论】:
-
我认为 DLL 必须使用 C 调用约定,这意味着没有 C++ 成员函数。不过,这只是我的想法。
-
你是如何在 CL.exe 中导入类 Circle 的?
-
您可以在 DLL 接口中导出 C++ 类。问题是 C++ 名称修改应用于导出的符号。由于没有名称修饰的标准,因此每个编译器都会以不同的方式进行操作。有时,同一编译器的不同版本会以不同的方式执行此操作。这通常是个坏主意。
标签: c++ windows visual-studio dynamic-linking