Использование vcpkg с Visual Studio 2022 приводит к фиктивной неразрешенной ошибке компоновщика внешних символов

#c #visual-studio #linker-errors #lib #vcpkg

#c #visual-studio #компоновщик-ошибки #библиотека #vcpkg

Вопрос:

У меня есть проект MFC C , который отлично работает с Visual Studio 2022 в Windows 10. Проект вообще не использует Qt. После того, как я установил Qt 6.2.1 с помощью vcpkg, проект прекратил сборку с этой ошибкой компоновщика:

 1>Qt6EntryPoint.lib(qtentrypoint_win.cpp.obj) : error LNK2019: unresolved external symbol main referenced in function WinMain
 

Опять же, в моем проекте Qt6 не используется. Переход к проекту Configuration Properties и отключение Use Vcpkg приводит к повторной сборке. Что здесь происходит и как это исправить, не отключая vcpkg?


Я создал новое приложение C MFC с VS project wizard и настройками по умолчанию. Он отлично работает с включенным vcpkg.


Единственное разумное объяснение, которое я могу предложить, это то, что много поколений назад, в более старых версиях VS и Windows, мой проект некоторое время использовал несколько классов из ядра Qt4, что вызывало проблемы, поэтому функциональность была удалена. Я продолжал разрабатывать его в Windows без установленного Qt. Возможно ли, что какая-то ссылка на Qt все еще скрывается? Как ее найти? Я несколько раз проверял настройки и не мог их найти.


Я посмотрел на порядок поиска в библиотеке ( /VERBOSE:Lib ), и при vcpkg -> Use Autolink включенном режиме поиск в папках vcpkg выполняется в первую очередь. Есть ли способ заставить компоновщика сначала выполнить поиск системных папок?

Вот что происходит:

 1>    Searching C:srcvcpkginstalled\x64-windowslibQt6EntryPoint.lib:
1>      Found WinMain
1>        Referenced in msvcrt.lib(exe_winmain.obj)
1>        Loaded Qt6EntryPoint.lib(qtentrypoint_win.cpp.obj)
 

Исключая Qt6EntryPoint.lib with /NODEFAULTLIB:"Qt6EntryPoint.lib" не имеет никакого эффекта. Есть ли другой способ исключить это?

Комментарии:

1. Но вы используете Qt, вы связываете его. На что вы, вероятно, не рассчитывали, так это на то, что и MFC, и Qt являются фреймворками, которые хотят определить точку входа программы, поэтому они могут инициализироваться достаточно рано. Компоновщик выбрал WinMain() Qt. Исправить это немного неудобно, сначала вам придется связать библиотеку MFC. IIRC, зависимость ссылки вводится с помощью #pragma lib, вы должны назвать ее явно.

2. @HansPassant Но вы используете Qt , нет, я этого не делаю. Компоновщик ложно подбирает ее. Я изучу #pragma lib или попытаюсь исключить Qt6EntryPoint. библиотека из сборки.

Ответ №1:

Это означает, что вы должны открыть проблему в vcpkg.
Qt6EntryPoint.библиотека должна быть перемещена во вложенную папку /manual-link .
(Я действительно ненавижу ленивую функцию автоматической ссылки / связывания всего MSBuild в vcpkg.)

Комментарии:

1. Спасибо. Я сообщил о проблеме: github.com/microsoft/vcpkg/issues/22072 . Похоже, они собираются исправить это, как вы предложили.