我想我通过阅读 SO 和这篇 MSDN 文章了解了 LNK2019 错误的要点。
我有一个为什么问题和一个如何问题(都在标题中提出)。
为什么库会提供带有未实现功能的 .cpp 文件?我猜答案是: “所以最终用户可以自己实现这些功能,或者‘链接’其他一些功能。” (如果我错了,请纠正我,但我会继续这个假设。)
例如,在下面的截图中(点击查看大图),我展示了我遇到的 LNK2019 错误,以及有问题的文件wx.cpp
.
类中的所有方法mglCanvasWX
都没有实现(是的,我已经向下滚动了:-)。这是一个永久的 Pastebin,wx.cpp
这是输出,以防有人想查看代码,但我不会要求任何人走这么远。
这些功能如何实现?
我猜它是包含实现的.dll文件。因此,我需要找到实现、、等的.dll文件。(我猜我可以忽略所有其他类型的文件,.obj、.lib、.exp等)但是我怎么知道在哪里可以找到这些.dll文件?——甚至知道.dll文件可以实现这些功能,因为它们是二进制(非人类可读)文件?Window
ToggleAlpha
ToggleLight
很抱歉一次问两个问题,但我认为这些是解决此链接器错误所需了解的基本内容。(我觉得我错过了一个概念,即使我需要问两个问题。)提前感谢您提供的任何指导,很抱歉添加到现有的关于 SO 的 LNK2019 问题堆...
附录
这可能是相关的:
# define MGL_EXPORT __declspec(dllexport)
但我不确定这是否表明这个未实现的类被导出为 DLL(这样的 DLL 有什么用?),或者表明这个类必须由DLL 文件实现(这更有意义) .
另外,我提出我的问题“为什么要建立一个库...”的原因是该项目中的另一个依赖项mgl-fltk
提供了类似的源,但确实实现了类似的类及其功能(并且构建良好)!在此处查看屏幕截图。然而,它的类定义与 不同mgl-wx
,省略了MGL_EXPORT
,这暗示我 FLTK不打算在外部实现。
class mglCanvasFL : public mglCanvasWnd
理论
好的,经过更多思考,我想出了一个理论,但只有经验丰富的软件开发人员才能告诉我它是否合理/有意义。
MathGL 的开发人员是否可能根本没有解决这些定义?也就是说,MathGL 是否可能还不支持 wxWidgets?
看,在原始的 MathGL 源代码中,有这些文件:
QT、FLTK 和 GLUT都实现了它们的mglCanvasQT
,mglCanvasFL
和mglCanvasGLUT
,例如
// qt.cpp
void mglCanvasQT::Animation() { QMGL->animation(true); }
void mglCanvasQT::ToggleAlpha() { QMGL->setAlpha(!QMGL->getAlpha()); }
// fltk.cpp
void mglCanvasFL::Animation() { Fl::lock(); mgl_sshow_cb(0,mgl); Fl::unlock(); }
void mglCanvasFL::ToggleAlpha() { Fl::lock(); mgl->toggle_alpha(); Fl::unlock(); }
// glut.cpp
class mglCanvasGLUT : public mglCanvasGL
{
public:
// ...
void ToggleAlpha() { _mgl_key_up('r',0,0); }
void Animation() { _mgl_key_up('m',0,0); } ///< Run slideshow (animation) of frames
// ...
}
只有mglCanvasWX
那个没有实现,只有在它的类名前面mglCanvasWX
有宏。MGL_EXPORT
那么可能的解释是什么?WX 支持还不存在吗?或者,存在对 WX 的支持,但发现更容易作为外部库 (DLL) 提供?如果有经验的软件开发人员可以对此进行权衡,我将非常感激......