es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usar vcpkg con Visual Studio 2022 produce un error falso de símbolo externo no resuelto del enlazador.

Tengo un proyecto MFC C++ que se compila y ejecuta correctamente con Visual Studio 2022 en Windows 10. El proyecto no utiliza Qt en absoluto. Después de instalar Qt 6.2.1 con vcpkg, el proyecto dejó de compilarse con este error del enlazador:

1>Qt6EntryPoint.lib(qtentrypoint_win.cpp.obj) : error LNK2019: símbolo externo no resuelto main al que se hace referencia en la función WinMain

Nuevamente, mi proyecto no usa Qt6 en absoluto. Al deshabilitar “Use Vcpkg” en las “Configuration Properties” del proyecto, vuelve a compilarse. ¿Qué está sucediendo aquí y cómo solucionarlo sin deshabilitar vcpkg?


He creado una nueva aplicación MFC C++ con el asistente de proyectos de Visual Studio y la configuración predeterminada. Se compila correctamente con vcpkg habilitado.


La única explicación razonable que puedo ofrecer es que hace muchas generaciones, con una versión anterior de Visual Studio y Windows, mi proyecto utilizaba algunas clases de Qt4 core durante un tiempo, lo cual causaba problemas, por lo que esa funcionalidad se eliminó. Continué desarrollándolo en Windows sin Qt instalado. ¿Es posible que todavía quede alguna referencia a Qt? ¿Cómo encontrarla? He revisado la configuración varias veces y no encontré ninguna.


He observado el orden de búsqueda de bibliotecas (/VERBOSE:Lib) y con “vcpkg -> Use Autolink” habilitado, se buscan primero las carpetas de vcpkg. ¿Hay alguna forma de hacer que el enlazador busque primero las carpetas del sistema?

Esto es lo que está sucediendo:

1>    Buscando C:\src\vcpkg\installed\x64-windows\lib\Qt6EntryPoint.lib:
1>      Se encontró WinMain
1>        Referenciado en msvcrt.lib(exe_winmain.obj)
1>        Cargando Qt6EntryPoint.lib(qtentrypoint_win.cpp.obj)

Excluir Qt6EntryPoint.lib con “/NODEFAULTLIB:”Qt6EntryPoint.lib”” no tiene efecto. ¿Hay otra forma de excluirlo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para el error del enlazador con Qt6EntryPoint.lib

    El problema aquí es que el enlazador está buscando la función main en Qt6EntryPoint.lib, pero no puede encontrarla, lo que resulta en un error de símbolo externo no resuelto. Este error ocurre porque Qt6EntryPoint.lib se vincula automáticamente con la integración de vcpkg en Visual Studio.

    Una solución es desactivar la integración de vcpkg y quitar esta biblioteca de las rutas de búsqueda. Sin embargo, hay otra solución para solucionar este problema sin desactivar vcpkg.

    • Solución 1: Quitar Qt6EntryPoint.lib de las entradas del enlazador

    Podemos quitar Qt6EntryPoint.lib de las entradas del enlazador yendo a Propiedades del proyecto -> Enlazador -> Entrada -> Dependencias adicionales y quitar Qt6EntryPoint.lib de la lista.

    • Solución 2: Cambiar el orden de búsqueda de bibliotecas

    Para hacer que el enlazador busque primero en las carpetas del sistema, debemos cambiar el orden de búsqueda de bibliotecas. Podemos lograr esto agregando la opción /NODEFAULTLIB a las banderas del enlazador en las propiedades del proyecto:

    /DEFAULTLIB:kernel32.lib /DEFAULTLIB:user32.lib /DEFAULTLIB:gdi32.lib /NODEFAULTLIB:Qt6EntryPoint.lib /DEFAULTLIB:shell32.lib /DEFAULTLIB:ole32.lib /DEFAULTLIB:oleaut32.lib /DEFAULTLIB:uuid.lib /DEFAULTLIB:odbc32.lib /DEFAULTLIB:odbccp32.lib
    

    Ahora, el enlazador no buscará Qt6EntryPoint.lib y el proyecto se debería compilar correctamente.

    Conclusión

    En resumen, el error del enlazador con Qt6EntryPoint.lib se puede solucionar quitándolo de las entradas del enlazador o cambiando el orden de búsqueda de bibliotecas para buscar primero en las carpetas del sistema. Estas soluciones nos permitirán compilar sin desactivar vcpkg.

Comments are closed.