Я думаю, что понял суть ошибок LNK2019, прочитав SO и эту статью MSDN а>.
У меня есть один вопрос Почему и один вопрос Как (оба уже заданы в заголовке).
Почему библиотека должна предоставлять файл .cpp с нереализованными функциями? Я предполагаю, что ответ таков: "Таким образом, конечные пользователи могут сами реализовать эти функции или 'связать' что-то другое, что делает." (Пожалуйста, поправьте меня, если я ошибаюсь, но я продолжу это предположение.)
Например, на снимке экрана ниже (щелкните, чтобы увеличить версию) я показываю ошибки LNK2019, с которыми я столкнулся, а также файл-нарушитель wx.cpp
.
Ни один из методов в классе mglCanvasWX
не реализован (и да, я прокрутил вниз :-). Вот постоянная вставка для wx.cpp
, а вот результат на тот случай, если кто-то захочет взглянуть на код, но я бы никого не просил заходить так далеко.
Как реализуются такие функции?
Я предполагаю, что это файлы .dll, которые содержат реализации. Поэтому мне нужно найти файл .dll, реализующий Window
, ToggleAlpha
, ToggleLight
и т. д. (Я предполагаю, что могу игнорировать все другие типы файлов, .obj, .lib, .exp и т. д.) Но как знаю ли я где найти эти файлы .dll? Или даже знаю, что файл .dll реализует эти функции, поскольку они являются двоичными (нечитаемыми человеком) файлами?
Извините, что задаю сразу два вопроса, но я думаю, что это основные вещи, которые мне нужно понять, чтобы устранить эту ошибку компоновщика. (Я чувствую, что мне не хватает одной концепции, даже если мне нужно было задать два вопроса.) Заранее благодарю вас за любые советы, которые вы можете дать, и извините, что добавляю к существующей стопке 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)? Я был бы очень признателен, если бы опытный разработчик программного обеспечения мог повлиять на это...
mglWindow
иmglGLUT
для всего окна,Fl_MathGL
иQMathGL
как виджеты. Я успешно реализовалmglGLUT
, но это казалось ограниченным. Итак, я переключился на пример кода с использованиемmglWindow
, который, как я обнаружил, был включен в ‹mgl2/window.h›, и ошибочно полагал, что window.h требует WX ! Я еще не знаю, что именно правильно, но посмотрим... - person slackwing   schedule 03.03.2014