2011-12-22 15 views
11

Tengo una pregunta general sobre cómo se supone que se utilizarán .dll/.libs. Estoy creando un .dll para ser usado en mi proyecto, sin embargo, noté que cuando voy a compilar necesito vincular estáticamente el archivo .lib asociado con el .dll para que el proyecto se compile (de lo contrario, aparece el error de enlace "fatal"). error LNK1107: archivo no válido o dañado: no se puede leer a 0x300 "). Luego, cuando vaya a redistrobutear mi proyecto y luego lo actualice en el futuro, ¿tendré que enviar un nuevo .exe y un nuevo .dll en lugar de un nuevo .dll? Si ese es el caso, ¿por qué molestarse en usar .dll?Lib y enlace DLL a un error exe "no se puede leer en 0x300"

Respuesta

29

El .lib contiene stubs para las funciones, etc., que exporta el DLL. Vincula el .lib en su EXE y ahora su EXE sabe cómo llamar a las funciones. Pero, por supuesto, no hay función allí; las llamadas no van a ninguna parte. En el momento de la carga, cuando el sistema operativo carga su EXE, también carga su DLL, y luego remueve el EXE: cuando el EXE llama al resguardo, el cargador lo reemplaza con una llamada a la función real en el DLL.

Normalmente no es necesario enviar el .lib a sus clientes. Sin embargo, si sus clientes desean escribir sus propios EXE que usen su DLL, entonces deberán enviarles .lib para que puedan vincular su EXE con este.

Error de vinculador LNK1107 significa que ha intentado vincular a la DLL en lugar de a la .lib. Eso siempre es incorrecto, ya que, por definición, una DLL está vinculada dinámicamente en tiempo de ejecución, en lugar de estáticamente en tiempo de compilación.

+0

Estoy intentando lo que ha sugerido. Mi problema es que cuando estoy construyendo en modo de depuración no se genera ningún archivo lib. Solo se genera el archivo dll. ¿Cómo puedo generar el archivo lib en la versión de depuración? –

+0

Su comentario parece sugerir que obtiene un archivo lib en la compilación de lanzamiento, pero no en la compilación de depuración. ¿Está bien? Si es así, asegúrese de haber establecido las mismas opciones de enlazador en ambas compilaciones (excepto, por supuesto, para aquellas que necesitan ser diferentes entre versiones y depuración). –

+0

El enlazador generará la biblioteca de importación automáticamente si su archivo DLL contiene alguna Funciona con el atributo __declspec (dllexport), o si exporta funciones explícitamente con un archivo DEF. Tal vez su compilador __declspec (dllexport) está excluido porque está rodeado por #ifndef (_DEBUG) o algo así? –

Cuestiones relacionadas