Crear una dll a partir de una static library (.lib)

20/02/2004 - 10:22 por Salva | Informe spam
Hola,

me han llegado una serie de liberías estáticas (.lib) y
quiero pasarlas a dll. El problema es que no tengo el
código de estas librerías, sólo tengo el archivo .lib y
algun archivo .h. Estas librerías estan compiladas con
Visual C++ 6.0. Me han dicho que tengo que crear un
proyecto con Visual C++ como Dynamic Library (DLL) y que
tengo que declarar funciones en mi proyecto, que llamen a
las funciones de la librería que quiero utilizar.

Me han surgido varias dudas sobre este tema.

- ¿En el proyecto dll tengo que crear sólo el
archivo .cpp o también el archivo .h?

- ¿Tengo que crear un archivo .def para la librería dll
que estoy creando?

- ¿Si la librería .lib utiliza funciones que estan
declaradas en clases, tengo que incluir los archivos .h
donde estan declaradas estas clases en el proyecto dll?

Si alguien tiene algún artículo sobre creación de dll a
partir de lib o alguna cosa similar y me lo puede
indicar, le estaría muy agradecido.

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral González [MVP]
20/02/2004 - 10:46 | Informe spam
No entiendo muy bien por que tienes esta necesidad de combertir de lib a
dll.

- ¿En el proyecto dll tengo que crear sólo el
archivo .cpp o también el archivo .h?

Debes crear tambien un archivo .cpp supon que en el .h del .lib tienes int
funct1(int a, char *b);

En el cpp debes poner algo como

__declspec( dllexport ) int Myfunct1(int a, char *b)
{
return funct1(a, b);
}

- ¿Tengo que crear un archivo .def para la librería dll
que estoy creando?
Si necesitas exportar los nombre no decorados necesitaras un archivo .def y
declarar las funciones como extern "C"

- ¿Si la librería .lib utiliza funciones que estan
declaradas en clases, tengo que incluir los archivos .h
donde estan declaradas estas clases en el proyecto dll?

Deberas exportar las clases en la dll, para ello deberas segir la misma
tecnica que con las funciones de construir un wrapper a su alrededor.


Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
#2 Anonimo
20/02/2004 - 12:49 | Informe spam
Gracias de nuevo por tu ayuda.

La necesidad que tengo de crear la dll es porque la
necesito las librerías para utilizarlas con Borland C++ y
las que me han pasado estan hechas para ejecutarse bajo
Visual C++.

Por cierto, te suena por qué me dan estos mensajes de
error:
lt_xtrans.lib(lt_xTrans.obj) : error LNK2001: unresolved
external symbol "public: bool __thiscall
LizardTech::ColorSpace::operator!=(class
LizardTech::ColorSpace const &)const " (??
@@QBE_NABV01@@Z)

lt_xtrans.lib(lt_xTrans.obj) : error LNK2001: unresolved
external symbol "void __cdecl LizardTech::LT_saveTo(class
std::basic_ostream<char,struct std::char_traits<char> >
&,int,enum Endian)" (?@@YAXAAV?
$?$char_tra

Gracias de nuevo por tu ayuda
Respuesta Responder a este mensaje
#3 Salva
20/02/2004 - 12:53 | Informe spam
Muchas gracias de nuevo por tu ayuda.

La necesidad que tengo de convertir las librerías a dll
es porque las que me han llegado están hechas para Visual
C++ y yo las necesito para Borland C++.

Por cierto. Cuando tengo creado el proyecto de la dll y
en el archivo .def le pongo según que función a exportar
me da estos errores, entre otros similares:

lt_xtrans.lib(lt_xTrans.obj) : error LNK2001: unresolved
external symbol "public: __thiscall
std::ios_base::Init::Init(void)" (??
@std@@)

lt_xtrans.lib(lt_xTrans.obj) : error LNK2001: unresolved
external symbol "void __cdecl LizardTech::LT_saveTo(class
std::basic_ostream<char,struct std::char_traits<char> >
&,int,enum Endian)" (?@@YAXAAV?
$?$char_tra

¿Sabes a que se pueden deber?

Muchas gracias.
Respuesta Responder a este mensaje
#4 Rodrigo Corral González [MVP]
20/02/2004 - 17:39 | Informe spam
Mira si este procedimiento te funciona:

Here is the procedure for building a wrapper dll for a static library
that has been provided in (in this case) in Microsoft v4.0 format by a
third party along with include files.
In this case the static library is called 'arapi.lib'.
Note VC 4.0 is 32 bit only

Launch Microsoft Visual C++

Create a new workspace project to build a 'Dynamic link-library'.
In this case I named it arapidll.

Insert arapi.lib (static lib) into the project

Attempting to build at this point gives this error :-
Linking...
LINK : warning LNK4001: no object files specified; libraries used
LINK : error LNK2001: unresolved external symbol

Debug/arapidll.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
arapidll.dll - 2 error(s), 1 warning(s)

The problem is that you must have a 'c' file in the project even
though it is empty.
Create a file lib.c with just the following line
// This file is needed just to avoid a link error LNK2001


Attempting to build at this point gives this error :-
Compiling...
lib1.c
Linking...
LINK : fatal error LNK1104: cannot open file "LIBC.lib"
Error executing link.exe.
arapidll.dll - 1 error(s), 0 warning(s)

Select Build | Settings, C/C++ tabpage, Category Code generation
and set Use run-time library of 'Multithreaded DLL' which is
what the arapi.lib was originally built with

Attempting to build at this point should give :-
Compiling...
lib1.c
Linking...
arapidll.dll - 0 error(s), 0 warning(s)

At this point I used the Microsoft dumpbin utility, 'dumpbin /ALL
arapi.lib' to a text file.
I extracted the function names that I wanted to exported from the
public section and saved them.

Next I created a basic def text file named 'arapidll.def':-

;arapidll.def; The LIBRARY entry must be same as the
;name of your DLL, the name of
; our DLL is arapidll.dll
LIBRARY arapidll

EXPORTS

put your function name list here

and added the full list of function names into it after the EXPORTS.

Add this def file into the project.

Attempting to build at this point gives this error :-
arapi.lib(arb.obj) : error LNK2001: unresolved external symbol

arapi.lib(ar.obj) : error LNK2001: unresolved external symbol
arapi.lib(ar.obj) : error LNK2001: unresolved external symbol

Debug/arapidll.dll : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.
arapidll.dll - 4 error(s), 1 warning(s)

I added wsock32.lib to the project (see settings on the Link tabpage)
in order to fulfil the unresolved externals that this particular
static library required.


Attempting to build at this point should give :-
Compiling...
lib1.c
Linking...
Creating library Debug/arapidll.lib and object Debug/arapidll.exp
arapidll.dll - 0 error(s), 0 warning(s)


Generating an import library suitable for use with Borland
C++ Builder
=Due to a mismatch in leading underscore on function names, expected
by Borland and not present in the Microsoft dll we have to perform a
bit of manipulation to get an import library suitable for Borland
usage.

Run the Borland impdef tool :-
impdef tempdef arapidll.dll

At this stage I used a utility downloaded from the internet called
'fixdef' to automatically alias exported functions to possess leading
underscores.
This can be done manually but can be tedious if there are a lots of
function names to alias. (I found what appeared to be a little bug in
this utility that caused the source file to always be overwritten
regardless of what filename you wanted to save as).

Basically it changes the lines in the export section to be as shown
below :-
LIBRARY ARAPIDLL.DLL

EXPORTS
_ARAddErrorMessage=ARAddErrorMessage
_ARAddErrorMessageId=ARAddErrorMessageId
_ARBuildParsePositionMessage=ARBuildParsePositionMessage
...more function names...

Then run the Borland implib tool to generate an import library from
the def file.
implib arapidll.lib tempdef.def

That's it, the import library (arapidll.lib) can be used in the C++
Builder project of your choice.
Respuesta Responder a este mensaje
#5 Salva
20/02/2004 - 18:12 | Informe spam
Gracias por el artículo, pero ya lo tengo y lo he
seguido. El problema que tengo y que no sé solucionar es
cuando hago el paso de dumpbin /all de la librería .lib,
ya que no me indica ninguna función como export. He
ejecutado el dumpbin /all sobre otra librería de windows
y al final ponía
Exports ordinal

y una serie de funciones, pero al aplicarlo sobre la
librería que utilizo sólo me salen public symbols y coff
symbol table.

Entonces pongo las funciones que me salen en el coff
symbol table en un fichero .def, pero a la hora de
compilar me da los errores que te he enseñado antes.

El problema también es que no sé cómo tengo que hacer el
wrapper de las funciones ni de las clases. Te explico lo
que hago y si me equivoco y te parece bien me lo puedes
decir.

Primero creo el proyecto como Dynamic Library. Le adjunto
con Project->Add files, la librería de la que quiero
crear la dll. Aquí me pierdo un poco porqué ya no sé si
tengo que crear el archivo .def con las funciones que
quiero, o bien un archivo .cpp y poner lo de las
funciones con lo de extern "c" y __declspec(dllexport).
Siguiendo el paso que siga, siempre me acaban dando los
errores que te he enseñado en el otro mensaje. El
archivo .cpp tiene el siguiente código

////////////////////////////////////////////////////////
#include <windows.h>
#include "lt_appSupport.h"

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllexport) void MyTerminate()
{
lt_terminateAppSupport();
}

#ifdef __cplusplus
}
#endif
///////////////////////////////////////////////////////

En el archivo del include "lt_appSupport.h" la función
está declarada:
LT_APP_SUPPORT_API void lt_terminateAppSupport();

Anteriormente, en el .h hay declarado

//////////////////////////////////////////////////////////
/* Begin by assuming we are a DLL-client... */
#if defined(_LT_INC_DLL)
#define LT_APP_SUPPORT_API __declspec( dllimport )
#else
#define LT_APP_SUPPORT_API
#endif

/* ...but if we are building a given DLL, turn on exports
for that one */
#ifdef LT_BLD_DLL_APP_SUPPORT
#undef LT_APP_SUPPORT_API
#define LT_APP_SUPPORT_API __declspec( dllexport )
#endif
//////////////////////////////////////////////////////////

Si te lo puedes mirar, muchas gracias y sino, gracias
igualmente.

Seguramente haré mal lo del wrapper de las funciones.

Muchas gracias.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida