ошибка компоновщика при использовании Qt и Boost - PullRequest
7 голосов
/ 19 ноября 2011

Когда я использую Qt (v4.7.4) и Boost (пробовал v1.47 и v1.48) вместе в моем проекте c ++, я получаю ошибку компоновщика, вызванную классом, включающим <boost\filesystem.hpp>. Я просто настроил Qt и до того, как код заработал без проблем.

Это сообщение об ошибке:

... obj: ошибка LNK2001: неразрешенный внешний символ "private: статический класс std :: codecvt const * & __cdecl boost :: filesystem3 :: path :: wchar_t_codecvt_facet (void)" (? Wchar_t_codecvt_facet @ path @ filesystem3 @ boost @@ CAAAPBV? $ codecvt @ GDH @ станд @@ XZ)

... obj: ошибка LNK2001: неразрешенный внешний символ "void __cdecl boost :: filesystem3 :: path_traits :: convert (char const *, char const *, класс std :: basic_string, класс std :: allocator>>, class std :: codecvt const &) "(? convert @ path_traits @ filesystem3 @ boost @@ YAXPBD0AAV? $ basic_string @ GU? $ char_traits @ G @ std @@ V? $ allocator @ G @ 2 @@ std @@ ABV? $ codecvt @ GDH @ 5 @@ Z) * ​​1009 *

... obj: ошибка LNK2001: неразрешенный внешний символ "void __cdecl boost :: filesystem3 :: path_traits :: dispatch (класс boost :: filesystem3 :: directory_entry const &, класс std :: basic_string, класс std :: allocator > &, класс std :: codecvt const &) "(? dispatch @ path_traits @ filesystem3 @ boost @@ YAXABVdirectory_entry @ 23 @ AAV? $ basic_string @ GU? $ char_traits @ G @ std @@ V? $ allocator @ G @ 2 @@ станд @@ ABV? $ codecvt @ GDH @ 6 @@ Z) * ​​1011 *

... obj: ошибка LNK2001: неразрешенный внешний символ "void __cdecl boost :: filesystem3 :: path_traits :: convert (короткое const без знака *, короткое const без знака *, класс std :: basic_string, класс std :: allocator> &, класс std :: codecvt const &) "(? convert @ path_traits @ filesystem3 @ boost @@ YAXPBG0AAV? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@ std @@ ABV? $ codecvt @ GDH @ 5 @@ Z) * ​​1013 *

... exe: фатальная ошибка LNK1120: 4 неразрешенных внешних кода

EDIT:

Здесь Я обнаружил, что кто-то с этой проблемой приходит к такому выводу:

это действительно проблема Qt. Используя wchar_t как нативный тип, вы должны перекомпилируйте Qt, используя тот же ключ компилятора. Там даже есть ошибка в трекер: https://bugreports.qt.io/browse/QTBUG-9617

В общем, вам нужно быть очень осторожным и не смешивать wchar_t настройки компилятора в ваших проектах, так как они станут несовместимыми.

Поэтому я перекомпилировал настройку Qt /Zc:wchar_t, но она не показала никакого эффекта. Я все еще получаю ту же ошибку.

Ответы [ 3 ]

8 голосов
/ 23 ноября 2011

Я думаю, что вы на правильном пути, но, похоже, ваш -Zc:wchar_t не "прилипает". Нам пришлось сделать то же самое, чтобы порадовать Qt Google Breakpad и библиотекой ICU. Мы изменили настройку /Zc:wchar_t в (QT_SOURCE)\mkspecs\win32-msvc2008\qmake.conf и скомпилировали Qt из исходного кода, после чего все работает.

Когда вы создаете свой проект, который использует Qt и Boost, вы должны увидеть эту опцию в выходных данных компилятора. Что-то вроде:

cl -c -nologo -Zm200 -Zc:wchar_t ... (etc.)

Если вы уже собрали Qt без этой опции, вам, возможно, придется сначала выполнить make confclean, чтобы убедиться, что все действительно восстановлено с новыми настройками.

Звучит так: -Zc: wchar_t будет по умолчанию в Qt 5 .

2 голосов
/ 08 мая 2014

При использовании boost-1.49, Qt 4.4 и VS2005 имели ту же проблему. Переход к свойствам проекта, затем настройка «Свойства конфигурации -> C / C ++ -> Язык -> Обрабатывать wchar_t как встроенный тип» в «Да» исправили проблему.

0 голосов
/ 20 ноября 2011

Qt, вероятно, изменил типологию вашей программы в отношении конфигурации среды выполнения: следовательно, используемая вами библиотека форсирования (файловая система), которая входит во многие конфигурации, к которым применяется соглашение об именах, не может быть найдена.

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

Вы должны пропустить файл nonystem-wchar filesystem.lib.Когда я использовал Windows, я использовал boost Jam для взаимодействия с Visual C ++ (возможно, это восходит к прошлому millenium !).Надеюсь, он еще пригоден для использования.

...