转换应用程序以使用DLL时LNK2019

时间:2009-10-14 15:02:03

标签: c++ dll visual-studio-2005 linker

(为清晰起见重写)

我有一个多项目解决方案,我希望将.lib转换为.DLL文件。我创建了__declspec宏并将其应用于每个类,除了那些创建最终.exe的项目。然而,链接器几乎适用于所有东西。我已经设置为忽略有关导出模板化对象的错误。

一个例子是:

  

错误LNK2019:未解析的外部   符号“__declspec(dllimport)public:   void __thiscall   Rail :: SetNextRail(类铁路*)“   (__imp_?SetNextRail @铁路@@ QAEXPAV1 @@ Z)   在函数“public:static中引用   void __cdecl   MyUtilities :: CreateBezierRails(INT,类   MyVector *,类std :: vector> &)“(?CreateBezierRails @ MyUtilities @@ SAXHPAVMyVector @@ AAV?$ vector @ PAVRail @@ V?$ allocator @ PAVRail @@@ std @@@ std @@@ Z)MyUtilities.obj

我的__declspec(dllimport)上未解析的外部符号?这似乎不对。它将通过以下宏来放置:

#ifdef MYAI_EXPORT
#define DECLSPECAI __declspec(dllexport)
#else
#define DECLSPECAI __declspec(dllimport)
#endif

基本上,给出了什么?为什么我会收到这些错误,如何解决?感谢所有到目前为止都试图提供帮助的人,但我仍然坚持这一点。

4 个答案:

答案 0 :(得分:2)

您是否链接到MyRenderer.lib?

答案 1 :(得分:2)

使用

导出函数和类吗?
__declspec(dllexport)

并使用

导入它们
__declspec(dllimport)

?如果没有,你将不得不这样做。在头文件中,在编译DLL时,您需要使用dllexport子句,并且在其他DLL或EXE中使用头时,您必须使用dllimport子句。您可以通过定义像

这样的宏来轻松完成此操作
// set this in preprocessor options for the DLL
#ifdef MYDLL
# define MYDLL_IMPORTEXPORT __declspec(dllexport)
#else
# define MYDLL_IMPORTEXPORT __declspec(dllimport)
#endif
class MYDLL_IMPORTEXPORT MyClass {};

答案 2 :(得分:0)

嗯,它说它发现了一个声明但没有实现。你确定你是用文件中的函数实现编译的吗?您是否记得在DrawVertices调用之前放置MyRenderer ::您确定要将两个库链接到可执行文件吗?

编辑:在编译lib时,库会有效地留下一个存根,当你可以将它链接到我时,我想要这个函数。

运行链接器时,它会遍历查找这些存根的所有库,并将它们“链接”到实际的实现中。您构建的每个cpp文件都编译为一个目标文件,并且该目标文件的工作方式完全相同。如果它无法将存根链接到实际函数,那么就会出现链接器错误,例如您所看到的错误。因此,您的渲染器库未链接到可执行文件中,或者实现缺少重要的内容,例如MyRenderer ::。虽然如果是后者我会期望出现其他问题,例如缺少IDirect3DDevice,我认为,这是该类的成员。因此,很可能,您无法链接.lib。

答案 3 :(得分:0)

有不同的DLL配置。

  • 静态链接DLL - 实现在DLL中,定义在.lib中。你静态链接到.lib(有点像标题),lib告诉c ++如何调用该函数。这可能是你想要的。确保你的__declspec正确。
  • 动态链接DLL - 一切都在DLL中,定义也在DLL中,你需要手动设置所有导出的东西的函数指针,这些东西在运行时由字符串索引。

谷歌将帮助并制作这个CW,以便有人可以减少这个答案。

我还建议你让DLL在骨架应用程序中运行。