今天我想制作自己的动态库。我正在使用VC++2010。尝试应用控制台示例(来自http://msdn.microsoft.com/en-us/library/ms235636%28v=vs.80%29.aspx)但我一直失败。以下是我遵循的步骤:
- 创建Win32项目并从向导中选择"空项目"、"DLL"
-
使用创建标题
// FILE: bday.h #ifndef BDAY_H_ #define BDAY_H_ #ifdef BUILD_DLL #define PORT_DLL __declspec(dllexport) #else #define PORT_DLL __declspec(dllimport) #endif namespace Tests { public class BDay { public: static PORT_DLL double Foo(double); }; }; #endif
- 创建一个.cpp来实现该类
- 建立这个成功的项目
然后我选择
- 创建Windows窗体项目,添加对以前创建的.dll的引用
- 包括上一个项目的bday.h
- 定义BUILD_DLL常量
- 添加一个按钮,单击后调用Tests:BDay::Foo
建设这个项目给了我
1>CoreResGen:
1> Processing resource file "Form1.resX" into "Debuggeneratory2.Form1.resources".
1>generatory2.obj : error LNK2028: unresolved token (0A00000F) "public: static double __cdecl Tests::BDay::Foo(double)" (?Foo@BDay@Tests@@$$FSANN@Z) referenced in function "private: void __clrcall generatory2::Form1::button4_Click(class System::Object ^,class System::EventArgs ^)" (?button4_Click@Form1@generatory2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>generatory2.obj : error LNK2019: unresolved external symbol "public: static double __cdecl Tests::BDay::Foo(double)" (?Foo@BDay@Tests@@$$FSANN@Z) referenced in function "private: void __clrcall generatory2::Form1::button4_Click(class System::Object ^,class System::EventArgs ^)" (?button4_Click@Form1@generatory2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>C:UsersPatrykDocumentsVisual Studio 2010Projectsgeneratory2Debuggeneratory2.exe : fatal error LNK1120: 2 unresolved externals
我一定做错了什么,你能指出错误在哪里吗?
如果您想将其引用为.Net类和方法,则需要这样做。
dll导出/导入用于非托管代码。(在您的情况下为本机c++)。
在c++项目中,您必须使用匹配的.lib文件编译.dll,然后链接lib文件以便找到函数。
另一方面,在.Net库中,您只需要引用dll。但为此,它需要编译为.Net库。
使用/CLR标志编译dll。并将该类作为参考。Net类:
namespace Tests
{
public ref class BDay
{
public:
static double Foo(double);
};
};
您不需要.Net 的declspec导出和导入