2008-08-08 8 views
6

He abierto un área de trabajo anterior que es una biblioteca y su arnés de prueba. Solía ​​funcionar bien, pero ahora no funciona y las versiones anteriores del código tampoco funcionan con los mismos errores. Intenté volver a crear el proyecto y eso causa los mismos errores también. Nada parece estar fuera de orden en la configuración del proyecto y el código generado funciona en la aplicación principal.Problemas de enlace (VC6)

He eliminado la mayoría de los archivos y lo he reducido al mínimo para generar el error. Desafortunadamente no puedo publicar el proyecto ya que esto se usa en el código de producción.

El error del enlazador LNK2001 que obtengo generalmente significa que he dejado una biblioteca u olvidado implementar una función virtual. Sin embargo, esto es parte de la biblioteca de plantillas estándar, y es un encabezado en eso.

El código que se muestra como teniendo el problema en IOCompletionPort.obj en realidad no utilizar std::string directamente, pero que llamar a una clase que: Comms::Exception acepta un std::string y el valor de GetLastError o WSAGetLastError.

Se implementa la función mencionada en el error (GetMessage), pero es una función virtual para que otras clases puedan anularla si es necesario. Sin embargo, parece que el compilador lo hizo como una versión de Ansi, pero no puedo encontrar ninguna opción en la configuración que controlaría eso. Sospecho que ese podría ser el problema, pero dado que hay muy pocas opciones para la biblioteca, no tengo forma de saberlo con certeza. Sin embargo, ambos proyectos especifican _MBCS en las opciones del compilador.

-------------------- Configuración: TestComms - Win32 Debug ------------------ - Vinculación ... Comms.lib (IOCompletionPort.obj) : error LNK2001: símbolo externo sin resolver "públicos: clase virtual std :: basic_string, clase std :: asignador> __thiscall Comms :: :: Excepción GetMessageA (void) const "(? GetMessageA @ Exception @ Comms @@ UBE? AV? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@ std @@ XZ) Debug/TestComms .exe: error fatal LNK1120: 1 elementos externos no resueltos Error al ejecutar link.exe.

TestComms.exe - 2 errores (s), 0 de aviso (s)

¿Alguna sugerencia? He perdido la mayor parte de la mañana y no quiero perder la mayor parte de la tarde también.

Respuesta

4

Una posibilidad radica en Win32 ANSI/Unicode "nombre-mangling", que se convierte en el símbolo GetMessage en cualquiera GetMessageA o GetMessageW. Hay tres posibilidades:

  1. Windows.h no se ha cargado, por lo que se queda GetMessageGetMessage

  2. Windows.h se cargó con símbolos establecidos por ANSI, por lo que se convierte en GetMessageGetMessageA

  3. Windows.h se cargó con símbolos establecidos para Unicode, por lo que GetMessage se convierte en GetMessageW

Si ha compilado dos archivos diferentes de forma que activan dos escenarios diferentes, obtendrá un error de enlazador.El mensaje de error indica que la clase Comms::Exception era una instancia del n. ° 2 anterior, ¿quizás se usa en alguna parte que windows.h no se ha cargado?

Otras cosas que haría en su lugar, simplemente como una cuestión de rutina:

1) Asegurar que mi incluyen rutas de biblioteca y no contienen nada que no estoy esperando.

2) Realice una "compilación limpia" y luego verifíquela manualmente, eliminando cualquier archivo de objeto extra si es necesario.

3) Asegúrese de que no haya rutas de acceso codificadas en las declaraciones include que no signifiquen lo que querían decir cuando el proyecto se reconstruyó originalmente.

EDIT: El luchar con el formato :(

0

windows.h se declara en la parte superior de IOCompletionPort.h como un incluyo - Estaba harto de ver 7 líneas sólo para incluir 1 archivo por lo que han envuelto su archivo propio e incluye que sí. Esto también contiene algunos #defines adicionales (es decir ULONG_PTR) como nuestra aplicación principal no se compilará con el SDK de la plataforma instalada :-(

  1. Ello se confirma. no hay nada fuera de lugar.
  2. He hecho eso - borré los directorios de compilación
  3. Nunca utilizo rutas codificadas.
0

que Suponiendo que no han futzed con los ajustes del proyecto de eliminar algo que no debemos tener (que es donde yo esperaría dependencias externas como User32.lib sea):

Verificar Herramientas | Opciones | Directorios | Bibliotecas (desde la memoria aquí) y asegúrese de no perderse los directorios de lib de variedad común (de nuevo, sin VC6 en frente mío, no puedo decir cuáles son)

1

@Curt : Creo que fuiste el más cercano. No he probado esto, pero creo que de alguna manera di la respuesta en mi pregunta original.

GetMessage es una definición en Windows.h envuelta en un bloque ifndef para alternar entre Ansi (GetMessageA) y Unicode (GetMessageW).

0

Este es un problema general con la forma en que Microsoft manejó las API ANSI frente a Unicode. Como todos (o casi todos) se hacen definiendo macros para los nombres de las funciones que se resuelven en las versiones 'A' o 'W' de los nombres de las funciones, no se puede tener un identificador en su espacio de nombres/clase/struct/enum/función que coincide con un nombre de API de Windows.

Las macros de windows.h pasan por encima de todos los demás espacios de nombres.

Cuestiones relacionadas