2009-12-03 17 views
5

Tengo un problema muy vago, pero espero que alguien pueda ayudarlo. Estaba modificando un proyecto de C++ y ayer todavía funcionaba, pero hoy no es así. Estoy bastante seguro de que no cambié nada, pero estoy completamente seguro de que revisé el proyecto desde SVN nuevamente e incluso volví a un punto anterior de restauración del sistema (porque esta es una computadora de trabajo, a veces instala secretamente actualizaciones, etc.) Después de compilarlo satisfactoriamente, el programa puede iniciarse, pero después de interactuar con él, aparece este error: El punto de entrada del procedimiento? MethodName @ className @@ UAEXXZ no se pudo ubicar en la biblioteca de vínculos dinámicos libName.dll.¿Por qué no se puede ubicar un "punto de entrada de procedimiento en dll" cuando definitivamente lo coloco?

He buscado en Internet, pero los problemas de la mayoría de las personas parecen ser causados ​​por una versión anterior de la DLL que se utiliza. Busqué en mi computadora y no hay una versión anterior. Si elimino la versión correcta, la aplicación no se inicia. Si luego vuelvo a compilar el proyecto, el archivo DLL se crea nuevamente, por lo que estoy bastante seguro de que la aplicación está utilizando la DLL correcta y de que la compilación la está creando. Si introduzco errores de sintaxis en el método al que se refiere el error, el proyecto se niega a compilar, así que supongo que esto significa que también está compilando los archivos que contienen el método.

Básicamente no sé nada sobre DLL, enlaces, etc. por lo que agradecería muchísimo si alguien tiene una idea de por qué las funciones que están claramente definidas en el proyecto de repente no lo hacen en la DLL más. Sé que esto es impreciso y si se requiere más información, con mucho gusto lo proporcionaré. ¡Gracias!

Actualización: He intentado las sugerencias dadas, pero todavía estoy atascado. __declspec(dllexport) aparentemente no se usa en todo el proyecto. Al abrir el archivo DLL con Dependency Walker, se muestra una sección superior derecha vacía y la sección debajo enumera la función del mensaje de error. Si puedo comprobar Undecorate C++ Funciones se ve bien, pero si no lo hago me sale los signos de interrogación y extraños @s desde el mensaje de error y no parece haber una diferencia en el final:

[email protected]@@UAEXXZ 
[email protected]@@[email protected] 

Tal vez este es el problema, pero no tengo idea de lo que significa, lo que pudo haber causado esto y lo que puedo hacer al respecto.

+0

¿Ha intentado agregar/opciones de compilador de Wall a VC++? Podría dar una pista ... – Romain

Respuesta

1

Me siento un poco estúpido, pero encontré la respuesta. La aplicación (exe) que estaba usando aparentemente cargó un segundo dll diferente que tenía una dependencia del mencionado en mi publicación original. Este segundo dll todavía esperaba las funciones anteriores y también necesitaba ser recompilado contra el dll actualizado.

¡Muchas gracias a la gente que intentó ayudarme aquí!

8

¿De verdad está usando __declspec(dllexport)? Mi suposición es que no, sin esa declaración, esa función no será exportada por el DLL (o en otras palabras, los programas que cargan ese DLL no tendrán acceso a funciones sin esa declaración).

Además, intente utilizar Dependency Walker para ver exactamente qué funciones tiene su DLL disponible.


El hecho de que __declspec(dllexport) no se utiliza en las declaraciones de función está bien - la mayoría de las veces, sólo se utilizará una vez en un fichero de cabecera única, como

#ifdef MAKING_DLL 
#define FOO_API __declspec(dllexport) 
#else 
#define FOO_API 
#endif 

Así que si tiene #define MAKING_DLL antes de esa sección, todas las funciones declaradas como FOO_API int BakeACake() se exportarán según se haya definido MAKING_DLL. Es posible que el proyecto esperara MAKING_DLL (o su equivalente) para ser definido en la línea de comando, dependiendo del tipo de proyecto construido (algo así como /DMAKING_DLL, o incluso podría necesitar definir FOO_API usted mismo como /DFOO_API=__declspec(dllexport).

La sección superior derecha vacía en Dependency Walker solo significa que su programa no está enlazando con el archivo .lib correspondiente de la DLL. Está bien, solo significa que está usando LoadLibrary o LoadLibraryEx para acceder a las funciones en la DLL.

Otro escenario bastante probable (basado en el hecho de que los nombres destrozados son diferentes) es que el programa se creó utilizando una versión diferente de Visual Studio que en 2008, que usó para compilar la DLL. A diferencia de la C simple, no hay una interfaz binaria estándar para C++, lo que significa que debe usar el mismo compilador para compilar el programa y la DLL cuando usa clases C++ en la DLL. Si puede, intente reconstruir el programa en VS2008 o intente reconstruir el archivo DLL en la misma versión de VS a medida que se creó el programa.

+0

¡Gracias por su respuesta! Intenté ver tus sugerencias, pero todavía estoy atascado (mira la actualización de mi pregunta). Si tienes más sugerencias, ¡sería genial! – Jordi

2

Descargue dependency walker y abra su dll usando esta herramienta. Mostrará una lista de funciones exportadas desde su dll. Compruebe si el método mencionado anteriormente es parte de las funciones esperadas. Si no es así, significa que accidentalmente eliminó __declspec(dllexport) para una de las clases en esa dll.

+0

Su respuesta parece ser exactamente la misma que en el póster de arriba, ¡pero gracias de todos modos! Probé las sugerencias, pero todavía estoy atascado (ver la actualización de mi pregunta). ¡Estaría agradecido por más ayuda! – Jordi

+0

@Jordi: Eso es lo primero que harán las personas cuando se enfrenten con este problema. Supongo que comenzamos a escribir juntos y él/ella completó antes que yo. – Ponting

0

Usando la información de las publicaciones anteriores encontré la solución general simple. Todo lo que necesita hacer es abrir programas ejecutables con el caminador de dependencias, buscar las funciones que faltan, ver qué dll lo están usando, encontrar el proyecto que construye ese dll y reconstruirlo.

Cuestiones relacionadas