Ошибки LNK2019/LNK2001: зачем библиотеке предоставлять файл .cpp с нереализованными функциями? (Как они реализуются?)

Я думаю, что понял суть ошибок 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)? Я был бы очень признателен, если бы опытный разработчик программного обеспечения мог повлиять на это...


person slackwing    schedule 03.03.2014    source источник
comment
@remyabel — Ах да, как-то так! Я хотел выводить визуализацию MathGL в окно, а не в файлы, и вот что говорится в документе MathGL: Существует набор «оконных» классов для создания окна с графикой MathGL: mglWindow и mglGLUT для всего окна, Fl_MathGL и QMathGL как виджеты. Я успешно реализовал mglGLUT, но это казалось ограниченным. Итак, я переключился на пример кода с использованием mglWindow, который, как я обнаружил, был включен в ‹mgl2/window.h›, и ошибочно полагал, что window.h требует WX ! Я еще не знаю, что именно правильно, но посмотрим...   -  person slackwing    schedule 03.03.2014


Ответы (1)


Святой Джей Скит, моя теория оказалась верной.

После нескольких часов экспериментов (и написания этого вопроса) я начал понимать, что, возможно, wxWidgets просто не был реализован для использования с MathGL. (См. редактирование «Теория» выше.) Я немного погуглил в этом новом контексте, и вуаля! — от самого сопровождающего MathGL (чье имя я узнал только потому, что это было имя пользователя/группы на снимке экрана 7-Zip выше). )—

MortenMacFly 22.01.11

Привет, интересно, что делает образец wx. Вроде готов заглушка, но функционал пока не реализован. Я хотел бы использовать эту библиотеку в проекте wxWidgets. Любые подсказки?

Алексей Балакин 25.01.11

Hi,

В основном да. Я перешел с wxWidgets на Qt много лет назад... Итак, я уже забыл многие особенности wxWidget и решил перестать делать рабочее окно на основе wxWidget. Есть несколько моментов: у MathGL уже есть 2 (на основе FLTK и Qt), у меня не так много времени, чтобы написать|протестировать wxWidget :(.

Итак, прямо сейчас вы можете сделать следующее:

1) Используйте растровое изображение RGB, созданное MathGL, для отображения изображения в вашем элементе управления wxWidget. Здесь есть образец http://mathgl.sourceforge.net/mathgl_en/mathgl_en_10.html#Drawing-in-memory

2) Используйте виджет wxMathGL, определенный в mgl/mgl_wx.h. Я очень надеюсь, что это должно работать как есть, но я не проверял это :(

3) Помогите мне и напишите | протестируйте виджет wxMathGL и класс mglGraphWX, который будет отображать окно с элементами управления, основанными на wxWidget. Я (и другие, я думаю), буду очень благодарен.

В треде, в котором я нашел это, также обсуждаются некоторые альтернативы, хотя я не знаю, работают ли они.

person slackwing    schedule 03.03.2014