Ошибка компоновщика MSVS2010 - не совсем уверен, что не так - PullRequest
1 голос
/ 13 октября 2010

Я использую библиотеку кода из учебника для обеспечения функциональности для передачи функциональных точек нестатических функций-членов в функцию, которая ожидает указатель статической функции, вероятно, помогает узнать, что я подаю в суд, поэтому вот ссылкаhttp://www.codeproject.com/KB/cpp/thunk32.aspx В этом коде используется библиотека Boost, которую я скачал и настроил более или менее из всего.

В библиотеке Thunk один из заголовочных файлов имеет раздел, который читает

#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,THUNK32_MAX_ARGS,"Thunk32_template.h"))
??=include BOOST_PP_ITERATE()
#undef BOOST_PP_ITERATION_PARAMS_1

но это дает мне невероятное количество ошибок, которые я могу решить, изменив его на

#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,THUNK32_MAX_ARGS,"Thunk32_template.h"))
#include BOOST_PP_ITERATE()
#undef BOOST_PP_ITERATION_PARAMS_1

Этот загруженный код включен в мое решение как второй проект, которыйв состоянии скомпилировать и построить счастливо.Но у моего проекта, использующего этот код, есть проблемы с линковкой, чтобы спасти людей, спрашивающих, я получаю эти сообщения об ошибках

1>WebCamera.obj : error LNK2019: unresolved external symbol "protected: __thiscall indev::Thunk32Base::Thunk32Base(void)" (??0Thunk32Base@indev@@IAE@XZ) referenced in function "public: __thiscall indev::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>(void)" (??0?$Thunk32@VWebCamera@@$$A6AXPAUHWND__@@PAUvideohdr_tag@@@Z@indev@@QAE@XZ)
1>WebCamera.obj : error LNK2019: unresolved external symbol "protected: __thiscall indev::Thunk32Base::~Thunk32Base(void)" (??1Thunk32Base@indev@@IAE@XZ) referenced in function "public: __thiscall indev::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>::~Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>(void)" (??1?$Thunk32@VWebCamera@@$$A6AXPAUHWND__@@PAUvideohdr_tag@@@Z@indev@@QAE@XZ)
1>WebCamera.obj : error LNK2019: unresolved external symbol _capCreateCaptureWindowA@32 referenced in function "public: bool __thiscall WebCamera::Init(struct HWND__ *)" (?Init@WebCamera@@QAE_NPAUHWND__@@@Z)

Я думаю, что это пытается сказать, что конструктор и деструктор не объявлены и что моя WebCamera.Init () также запутался.Я убедился, что библиотека, которую экспортирует проект Thunk32, включена в мой другой проект, но все же я получаю эти ошибки.

Я хотел бы знать, правильно ли я предположил, что ??=include должен иметьбыло изменено на #include, и если я это сделал, то, что я сделал неправильно или не смог сделать это, приводит к этим ошибкам компоновщика.Или, если вы можете предоставить мне другой способ передать указатель функции на нестатическую функцию-член, это было бы здорово.

Спасибо

Ответы [ 4 ]

3 голосов
/ 13 октября 2010

??= - это последовательность "триграфа" для символа #.в соответствии со стандартом триграфы должны обрабатываться как один из первых этапов обработки (на этапе 1 - до того, как препроцессор обработает директивы), поэтому:

??=include "whatever"

должно быть эквивалентно:

#include "whatever"

так что вы должны иметь возможность использовать эту форму (интересно, почему триграф был поставлен там - какая-то злая шутка?)

Однако триграфы вызывают проблемы и путаницу(вероятно, больше, чем они помогают), поэтому, похоже, компиляторы движутся к предупреждению о них и / или по умолчанию не обрабатывают их.Компилятор в VS 2010 по умолчанию отключил обработку триграфа - для его включения необходимо использовать опцию /Zc:trigraphs.

Подробнее см. Назначение последовательностей триграфа в C ++? .

2 голосов
/ 13 октября 2010

Ах, Эйнар, хороший человек.В наши дни занимаюсь Flash и Sharepoint.Норвежский, может объяснить триграфы.

Во всяком случае, ничего сложного, вы просто забыли сказать компоновщику взглянуть на некоторые библиотеки.Щелкните правой кнопкой мыши свой проект, Project Dependencies, отметьте галочкой проект Thunk.Это гарантирует, что Thunk32.lib просматривается и разрешает ctor и dtor.

Снова щелкните правой кнопкой мыши, Properties, Linker, Дополнительные зависимости, добавьте "winmm.lib"Это разрешает символ capCreateCaptureWindow.

0 голосов
/ 14 октября 2010

Хорошо, теперь мне удалось решить эту проблему.

Майкл Барр Никли сказал, что ??= - это то же самое, что набирать #, но таким образом, что люди, которыеУ вас нет символа хеша, введите его, см. Назначение последовательностей триграфов в C ++?

Ганс Пассант затем заставил меня купить мяч, давая мне понять, что яне полностью связаны в материале.Мне нужно было щелкнуть правой кнопкой мыши по моему основному проекту, выбрать «Зависимости проекта» и выбрать другой проект с кодом thunk32.Мне также нужно было указать моему основному проекту, чтобы посмотреть, где проект Thunk сохраняет библиотеку, которая оказалась в папке в моих документах (объясните это!).Мне также нужно было добавить Thunk32d.lib (обратите внимание на 'd', потому что я был / нахожусь в режиме отладки. Ханс сказал, что мне нужно winmm.lib, но оказалось (при поиске нужной мне функции, которая выдавала мне ошибку)Vfw32.lib вместо этого.

Спасибо, ребята! Я надеюсь, что, дав полный ответ, подобный этому, он может помочь кому-то еще, кто имеет подобную проблему.

0 голосов
/ 13 октября 2010

У вас есть конструктор и деструктор, объявленный в классе indev :: Thunk32Base, который вы забыли определить в его файле cpp?

...