(为清晰起见重写)
我有一个多项目解决方案,我希望将.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
基本上,给出了什么?为什么我会收到这些错误,如何解决?感谢所有到目前为止都试图提供帮助的人,但我仍然坚持这一点。
答案 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配置。
__declspec
正确。谷歌将帮助并制作这个CW,以便有人可以减少这个答案。
我还建议你让DLL在骨架应用程序中运行。