C++ LNK2019/LNK2001错误:为什么库会提供带有未实现函数的.cpp文件?(它们是如何实施的?)
我想通过阅读某某的资料,我理解了LNK2019错误的要点 我有一个为什么的问题和一个如何的问题(这两个问题已经在标题中提出了) 为什么库会提供一个包含未实现函数的.cpp文件?我猜答案是:“这样最终用户就可以自己实现这些函数,或者‘链接’其他一些功能。”(如果我错了,请纠正我,但我将继续这个假设。) 例如,在下面的屏幕截图中(单击查看更大的版本),我显示了我遇到的LNK2019错误,以及有问题的文件,C++ LNK2019/LNK2001错误:为什么库会提供带有未实现函数的.cpp文件?(它们是如何实施的?),c++,visual-c++,wxwidgets,lnk2019,mathgl,C++,Visual C++,Wxwidgets,Lnk2019,Mathgl,我想通过阅读某某的资料,我理解了LNK2019错误的要点 我有一个为什么的问题和一个如何的问题(这两个问题已经在标题中提出了) 为什么库会提供一个包含未实现函数的.cpp文件?我猜答案是:“这样最终用户就可以自己实现这些函数,或者‘链接’其他一些功能。”(如果我错了,请纠正我,但我将继续这个假设。) 例如,在下面的屏幕截图中(单击查看更大的版本),我显示了我遇到的LNK2019错误,以及有问题的文件,wx.cpp 类mglCanvasWX中的任何方法都没有实现(是的,我向下滚动了:-)。下面是
wx.cpp
类mglCanvasWX
中的任何方法都没有实现(是的,我向下滚动了:-)。下面是wx.cpp
,下面是,以防有人想查看代码,但我不会要求任何人走这么远
这些功能是如何实现的?
我猜是.dll文件包含了这些实现。因此,我需要找到实现Window
、ToggleAlpha
、ToggleLight
等的.dll文件。(我猜我可以忽略所有其他类型的文件,.obj、.lib、.exp等),但我如何知道在哪里可以找到这些.dll文件?-或者甚至知道.dll文件确实实现了这些功能,因为它们是二进制(非人类可读)文件
很抱歉同时问两个问题,但我认为这些是解决链接器错误所需了解的基本内容。(我觉得我遗漏了一个概念,即使我需要问两个问题。)提前感谢您提供的任何指导,并且很抱歉在现有的LNK2019问题堆中添加以下内容
补遗 这可能与:
# define MGL_EXPORT __declspec(dllexport)
但我不确定这是否表明这个未实现的类是作为DLL导出的(这样的DLL有什么用?),还是表明这个类必须由DLL文件实现(这更有意义)
另外,我之所以提出我的问题“为什么库会…”,是因为这个项目中的另一个依赖项,mgl fltk
,提供了类似的类及其函数,但确实实现了类似的类及其函数(并且构建得很好)!请看屏幕截图。然而,它的类定义不同于mglwx
,它省略了mgl_导出
,这向我暗示了FLTK不打算在外部实现
class mglCanvasFL : public mglCanvasWnd
理论 好的,经过进一步思考,我提出了一个理论,但只有一位经验丰富的软件开发人员才能告诉我它是否合理 MathGL的开发人员可能根本没有着手实现这些定义吗?也就是说,MathGL是否可能还不支持wxWidgets 请参见,在原始MathGL源中,有以下文件: QT、FLTK和GLUT都实现了它们的
mglcavasqt
、mglcavasfl
和mglcavasglut
,例如
//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
mglCanvasGLUT类:公共mglCanvasGL
{
公众:
// ...
void ToggleAlpha(){u mgl_key_up('r',0,0);}
void Animation()
// ...
}
只有mglcavaswx
没有实现,只有mglcavaswx
在其类名前面有MGL\u EXPORT
宏
那么可能的解释是什么呢?WX支持还不存在?或者,WX支持存在,但作为外部库(DLL)更容易提供?如果一位经验丰富的软件开发人员能够参与进来,我将不胜感激。天哪,我的理论证明是正确的 经过几个小时的实验(并写下了这个问题),我开始意识到也许wxWidgets并不是为了与MathGL一起使用而实现的。(见上面的“理论”编辑)我在这个新环境下做了一些谷歌搜索,瞧-来自MathGL的维护者本人(我只认识他的名字,因为它是上面7-Zip屏幕截图中的用户名/组名)- 摩顿麦克弗利11年1月22日 你好,我想知道wx样本在做什么。好像有一个 存根已准备好,但尚未实现任何功能。我想用 此库位于wxWidgets项目中。有什么提示吗 2011年1月25日亚历克赛·巴拉金 嗨 基本上是的。多年前我从wxWidgets切换到Qt。。。所以 我已经忘记了很多wxWidget的洞察力,决定停止制作 基于wxWidget的工作窗口。有几个问题:MathGL 已经有2个(基于FLTK和Qt),我没有那么多时间 写|测试wxWidget one:( 因此,现在您可以执行以下操作: 1) 使用MathGL生成的RGB位图显示wxWidget中的图像 控制这里有一个样品 2) 使用mgl/mgl_wx.h中定义的wxMathGL小部件。我很希望它是什么 应该按原样工作,但我没有测试:( 3) 帮助我编写| test wxMathGL小部件和类mglGraphWX 将显示带有基于wxWidget.I(和其他I)控件的窗口 我会非常感激的
专家们还讨论了一些替代方案,尽管我不知道它们是否有效。@remyabel-啊,是的,类似的东西!我想将MathGL渲染输出到窗口,而不是文件,MathGL文档说:有一组“win”
// 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
// ...
}