Difference between revisions of "How to create a library with Qt and use it in an application/es"

From Qt Wiki
Jump to: navigation, search
m (Updating the code highlight label.)
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
'''Español''' [[How_to_create_a_library_with_Qt_and_use_it_in_an_application|English]]<br />[[Category:HowTo]]<br />[[Category:Developing_with_Qt::General]]<br />[[Category:QtDevelopmentSpanish::General]]<br />[[Category:Tutorial]]<br />[[Category:Spanish]]
+
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}
 +
 
 +
'''Español''' [[How_to_create_a_library_with_Qt_and_use_it_in_an_application|English]]
 +
[[Category:HowTo]]
 +
[[Category:Developing_with_Qt::General]]
 +
[[Category:QtDevelopmentSpanish::General]]
 +
[[Category:Tutorial]]
 +
[[Category:Spanish]]
  
[toc align_right=&quot;yes&amp;quot; depth=&quot;2&amp;quot;]
 
  
 
= Introducción =
 
= Introducción =
Line 9: Line 15:
 
== Creando una biblioteca compartida ==
 
== Creando una biblioteca compartida ==
  
Cuando se crea una biblioteca compartida con la cual te gustaria enlazar tu aplicacion, debes asegurar que los simbolos que vas a usar fuera de la biblioteca son correctamente exportados cuando la biblioteca es creada. Posteriormente importada cuando estás enlazando la biblioteca. Esta puede ser hecho usando &quot;Q_DECL_EXPORT &quot;:http://doc.qt.io/qt-4.8/qtglobal.html#Q_DECL_EXPORT y &quot;Q_DECL_IMPORT&amp;quot;:http://doc.qt.io/qt-4.8/qtglobal.html#Q_DECL_IMPORT como esta demostrado en el siguiente ejemplo:
+
Cuando se crea una biblioteca compartida con la cual te gustaria enlazar tu aplicacion, debes asegurar que los simbolos que vas a usar fuera de la biblioteca son correctamente exportados cuando la biblioteca es creada. Posteriormente importada cuando estás enlazando la biblioteca. Esta puede ser hecho usando [http://doc.qt.io/qt-4.8/qtglobal.html#Q_DECL_EXPORT Q_DECL_EXPORT ] y [http://doc.qt.io/qt-4.8/qtglobal.html#Q_DECL_IMPORT Q_DECL_IMPORT] como esta demostrado en el siguiente ejemplo:
 +
 
 +
'''test.h'''
 +
<syntaxhighlight lang="c++">
 +
#include <QtGui>
 +
 
 +
#if defined TEST
 +
#define TEST_COMMON_DLLSPEC Q_DECL_EXPORT
 +
#else
 +
#define TEST_COMMON_DLLSPEC Q_DECL_IMPORT
 +
#endif
 +
 
 +
class TEST_COMMON_DLLSPEC Widget : public QWidget
 +
{
 +
Q_OBJECT
 +
public:
 +
Widget();
 +
};
 +
 
 +
</syntaxhighlight>
 +
 
 +
'''test.cpp'''
 +
<syntaxhighlight lang="c++">
 +
#include <QtGui>
 +
#include "test.h"
 +
 
 +
Widget::Widget() : QWidget()
 +
{}
 +
</syntaxhighlight>
 +
 
 +
'''test.pro'''
 +
<syntaxhighlight lang="c++">TEMPLATE = lib
 +
# Input
 +
SOURCES ''= test.cpp
 +
HEADERS''= test.h
 +
DEFINES ''= TEST</syntaxhighlight>
 +
 
 +
Vea ademas la documentación en [http://doc.qt.io/qt-4.8/sharedlibrary.html Creating Shared Libraries].
 +
 
 +
=== Enlazando su aplicación contra la biblioteca compartida ===
 +
Con el fin de utilizar la biblioteca compartida en su aplicación, para que entonces usted pueda incluir los headers de su biblioteca y utilizar sus métodos. Compile enlazando con el arhivo .lib. En tiempo de ejecución esto carga el dll el cual tiene la implementación.
 +
 
 +
Para hacer esto, en el archivo .pro de su aplicación ustede necesita informar a la aplicación donde debe buscar los headers y la biblioteca. El [http://doc.qt.io/qt-4.8/qmake-variable-reference.html#includepath INCLUDEPATH] necesita apuntar al directorio donde los headers estan instalados, y la variable [http://doc.qt.io/qt-4.8/qmake-variable-reference.html#libs LIBS ] necesita apuntar al directorio del archivo .lib. Ademas usted necesita asegurar que el .dll es encontrado colocando en el directorio de la aplicación o en la variable global PATH.
 +
 
 +
Por ejemplo:
 +
 
 +
'''loadTestLib.pro'''
 +
<syntaxhighlight lang="c++">
 +
TEMPLATE = app
 +
TARGET =
 +
DEPENDPATH''= . ../testLib
 +
INCLUDEPATH ''= ../testLib
 +
LIBS''= -L../testLib/debug -ltestLib
 +
# Input
 +
SOURCES ''= main.cpp
 +
</syntaxhighlight>
 +
 
 +
'''main.cpp'''
 +
<syntaxhighlight lang="c++">
 +
#include <QtGui>
 +
#include "test.h"
 +
 
 +
int main(int argc, char *argv[])
 +
{
 +
QApplication a(argc, argv);
 +
Widget w;
 +
w.resize(100,100);
 +
w.show();
 +
return a.exec();
 +
}
 +
 
 +
 
 +
</syntaxhighlight>
 +
 
 +
=== Usando QLibrary para cargar la biblioteca compartida ===
 +
[http://doc.qt.io/qt-4.8/qlibrary.html#details QLibrary ] puede ser usado para cargar bibliotecas compartidas en tiempo de ejecución. En este caso usted solo necesitara tener accesi al .dll, acceso a los headers y el archivo .lib no es necesario.
 +
 
 +
El siguinte ejemplo muestra como configurar una biblioteca para utilizarla con QLibrary. Para que los nombres de las funciones puedan ser resueltos, los mismos deben ser como funciones de C (por ejemplo, sin el name mangling) de la biblioteca. Esto significa que las funciones deben estar dentro de un bloque extern "C" si la biblioteca es compilada con un compilador de C.
 +
 
 +
Desde que estamos haciendo esto en Windows, tambien debenmos exportar la funcion del DLL utilizando [http://doc.qt.io/qt-4.8/qtglobal.html#Q_DECL_EXPORT Q_DECL_EXPORT] y [http://doc.qt.io/qt-4.8/qtglobal.html#Q_DECL_IMPORT Q_DECL_IMPORT]
 +
 
 +
'''qlibraryLibrary.pro'''
 +
<syntaxhighlight lang="c++">
 +
TEMPLATE = lib
 +
HEADERS''= widget.h
 +
SOURCES ''= widget.cpp
 +
DEFINES''= TEST
 +
</syntaxhighlight>
 +
 
 +
'''widget.h'''
 +
<syntaxhighlight lang="c++">
 +
#include <QtGui>
 +
 
 +
#if defined TEST
 +
#define TEST_COMMON_DLLSPEC Q_DECL_EXPORT
 +
#else
 +
#define TEST_COMMON_DLLSPEC Q_DECL_IMPORT
 +
#endif
 +
 
 +
extern "C" TEST_COMMON_DLLSPEC QWidget* createWidget1();
 +
 
 +
</syntaxhighlight>
  
'''test.h'''<br /><code><br />#include &lt;QtGui&amp;gt;
+
'''widget.cpp'''
 +
<syntaxhighlight lang="c++">
 +
#include <QtGui>
 +
#include "widget.h"
  
#if defined TEST<br />#define TEST_COMMON_DLLSPEC Q_DECL_EXPORT<br />#else<br />#define TEST_COMMON_DLLSPEC Q_DECL_IMPORT<br />#endif
+
QWidget* createWidget1()
 +
{
 +
QWidget '''wid = new QWidget();
 +
wid->resize(100,100);
 +
return wid;
 +
}
  
class TEST_COMMON_DLLSPEC Widget : public QWidget<br />{<br /> Q_OBJECT<br />public:<br /> Widget();<br />};
+
</syntaxhighlight>
  
</code>
+
=== Cargando la biblioteca utilizando QLibrary ===
 +
Para cargar la biblioteca utilizando QLibrary, usted simplemente debe pasar el .dll al constructor de QLibrary. Asegurese que el .dll esta disponible en el directorio de la aplicación o dentro de la variable global PATH. Para utilizar estas funciones de la biblioteca en su aplicación, usted necesita encontrarlas utilizando [http://doc.qt.io/qt-4.8/qlibrary.html#resolve QLibrary::resolve()].
  
'''test.cpp'''<br /><code><br />#include &lt;QtGui&amp;gt;<br />#include &quot;test.h&amp;quot;
+
El siguiente ejemplo carga la biblioteca creada arriba y utiliza una de sus funciones para crear y mostrar un widget.
  
Widget::Widget() : QWidget()<br />{}<br /></code>
+
<syntaxhighlight lang="c++">
 +
#include <QtGui>
  
'''test.pro'''<br /><code>TEMPLATE = lib<br /># Input<br />SOURCES ''= test.cpp<br />HEADERS''= test.h<br />DEFINES ''= TEST</code>
+
int main(int argc, charargv)
<br />Vea ademas la documentación en &quot;Creating Shared Libraries&amp;quot;:http://doc.qt.io/qt-4.8/sharedlibrary.html.
+
{
<br />h3. Enlazando su aplicación contra la biblioteca compartida
+
QApplication app(argc, argv);
<br />Con el fin de utilizar la biblioteca compartida en su aplicación, para que entonces usted pueda incluir los headers de su biblioteca y utilizar sus métodos. Compile enlazando con el arhivo .lib. En tiempo de ejecución esto carga el dll el cual tiene la implementación.
+
QLibrary library("qlibraryLibrary.dll");
<br />Para hacer esto, en el archivo .pro de su aplicación ustede necesita informar a la aplicación donde debe buscar los headers y la biblioteca. El &quot;INCLUDEPATH&amp;quot;:http://doc.qt.io/qt-4.8/qmake-variable-reference.html#includepath necesita apuntar al directorio donde los headers estan instalados, y la variable &quot;LIBS &quot;:http://doc.qt.io/qt-4.8/qmake-variable-reference.html#libs necesita apuntar al directorio del archivo .lib. Ademas usted necesita asegurar que el .dll es encontrado colocando en el directorio de la aplicación o en la variable global PATH.
+
if (!library.load())
<br />Por ejemplo:
+
qDebug() << library.errorString();
<br />'''loadTestLib.pro'''<br /><code><br />TEMPLATE = app<br />TARGET =<br />DEPENDPATH''= . ../testLib<br />INCLUDEPATH ''= ../testLib<br />LIBS''= -L../testLib/debug <s>ltestLib<br /># Input<br />SOURCES ''= main.cpp<br /></code>
+
if (library.load())
<br />'''main.cpp'''<br /><code><br />#include &lt;QtGui&amp;gt;<br />#include &quot;test.h&amp;quot;
+
qDebug() << "library loaded";
<br />int main(int argc, char *argv[])<br />{<br /> QApplication a(argc, argv);<br /> Widget w;<br /> w.resize(100,100);<br /> w.show();<br /> return a.exec&amp;amp;#40;&amp;#41;;<br />}
 
  
<br /></code>
+
typedef QWidget'''('''CreateWidgetFunction)(void);
<br />h3. Usando QLibrary para cargar la biblioteca compartida
+
CreateWidgetFunction cwf = (CreateWidgetFunction)library.resolve("createWidget1");
<br />&quot;QLibrary &quot;:http://doc.qt.io/qt-4.8/qlibrary.html#details puede ser usado para cargar bibliotecas compartidas en tiempo de ejecución. En este caso usted solo necesitara tener accesi al .dll, acceso a los headers y el archivo .lib no es necesario.
+
if (cwf) {
<br />El siguinte ejemplo muestra como configurar una biblioteca para utilizarla con QLibrary. Para que los nombres de las funciones puedan ser resueltos, los mismos deben ser como funciones de C (por ejemplo, sin el name mangling) de la biblioteca. Esto significa que las funciones deben estar dentro de un bloque extern &quot;C&amp;quot; si la biblioteca es compilada con un compilador de C.
+
QWidget''' wid = cwf();
<br />Desde que estamos haciendo esto en Windows, tambien debenmos exportar la funcion del DLL utilizando &quot;Q_DECL_EXPORT&amp;quot;:http://doc.qt.io/qt-4.8/qtglobal.html#Q_DECL_EXPORT y &quot;Q_DECL_IMPORT&amp;quot;:http://doc.qt.io/qt-4.8/qtglobal.html#Q_DECL_IMPORT
+
if (wid)
<br />'''qlibraryLibrary.pro'''<br /><code><br />TEMPLATE = lib<br />HEADERS''= widget.h<br />SOURCES ''= widget.cpp<br />DEFINES''= TEST<br /></code>
+
wid->show();
<br />'''widget.h'''<br /><code><br />#include &lt;QtGui&amp;gt;
+
} else {
<br />#if defined TEST<br />#define TEST_COMMON_DLLSPEC Q_DECL_EXPORT<br />#else<br />#define TEST_COMMON_DLLSPEC Q_DECL_IMPORT<br />#endif
+
qDebug() << "Could not show widget from the loaded library";
<br />extern &quot;C&amp;quot; TEST_COMMON_DLLSPEC QWidget* createWidget1();
+
}
<br /></code>
+
return app.exec();
<br />'''widget.cpp'''<br /><code><br />#include &lt;QtGui&amp;gt;<br />#include &quot;widget.h&amp;quot;
+
}
<br />QWidget* createWidget1()<br />{<br /> QWidget '''wid = new QWidget();<br /> wid-&gt;resize(100,100);<br /> return wid;<br />}
+
</syntaxhighlight>
<br /></code>
 
<br />h3. Cargando la biblioteca utilizando QLibrary
 
<br />Para cargar la biblioteca utilizando QLibrary, usted simplemente debe pasar el .dll al constructor de QLibrary. Asegurese que el .dll esta disponible en el directorio de la aplicación o dentro de la variable global PATH. Para utilizar estas funciones de la biblioteca en su aplicación, usted necesita encontrarlas utilizando &quot;QLibrary::resolve()&quot;:http://doc.qt.io/qt-4.8/qlibrary.html#resolve.
 
<br />El siguiente ejemplo carga la biblioteca creada arriba y utiliza una de sus funciones para crear y mostrar un widget.
 
<br /><code><br />#include &lt;QtGui&amp;gt;
 
<br />int main(int argc, charargv)<br />{<br /> QApplication app(argc, argv);<br /> QLibrary library(&quot;qlibraryLibrary.dll&amp;quot;);<br /> if (!library.load())<br /> qDebug() &lt;&lt; library.errorString();<br /> if (library.load())<br /> qDebug() &lt;&lt; &quot;library loaded&amp;quot;;
 
<br /> typedef QWidget'''('''CreateWidgetFunction)(void);<br /> CreateWidgetFunction cwf = (CreateWidgetFunction)library.resolve(&quot;createWidget1&amp;quot;);<br /> if (cwf) {<br /> QWidget''' wid = cwf();<br /> if (wid)<br /> wid</s>&gt;show();<br /> } else {<br /> qDebug() &lt;&lt; &quot;Could not show widget from the loaded library&amp;quot;;<br /> }<br /> return app.exec&amp;amp;#40;&amp;#41;;<br />}<br /></code>
 
  
 
== Creando una biblioteca estatica ==
 
== Creando una biblioteca estatica ==
  
Al crear una biblioteca estatica usted debe especificar la opción staticlib al &quot;CONFIG &quot;:http://doc.qt.io/qt-4.8/qmake-variable-reference.html#config en el archivo .pro. En contraste al ejemplo de la biblioteca compartida, usted no necesita configurar nada especial para exportar e importar simbolos en su archivo .h, ya que la biblioteca sera construida dentro de la aplicación, por ejemplo:
+
Al crear una biblioteca estatica usted debe especificar la opción staticlib al [http://doc.qt.io/qt-4.8/qmake-variable-reference.html#config CONFIG ] en el archivo .pro. En contraste al ejemplo de la biblioteca compartida, usted no necesita configurar nada especial para exportar e importar simbolos en su archivo .h, ya que la biblioteca sera construida dentro de la aplicación, por ejemplo:
  
'''test.pro'''<br /><code><br />TEMPLATE = lib<br />CONFIG+= staticlib<br /># Input<br />HEADERS ''= test.h<br />SOURCES''= test.cpp<br /></code>
+
'''test.pro'''
 +
<syntaxhighlight lang="c++">
 +
TEMPLATE = lib
 +
CONFIG+= staticlib
 +
# Input
 +
HEADERS ''= test.h
 +
SOURCES''= test.cpp
 +
</syntaxhighlight>
  
 
=== Usando la biblioteca estatica en su aplicación. ===
 
=== Usando la biblioteca estatica en su aplicación. ===
  
De manera similar a lo que hicimos para cargar la biblioteca compartida, ahora debes configurar el &quot;INCLUDEPATH&amp;quot;:http://doc.qt.io/qt-4.8/qmake-variable-reference.html#includepath para que apunte al directorio donde se encuentran los headers y la variable &quot;LIBS&amp;quot;:http://doc.qt.io/qt-4.8/qmake-variable-reference.html#libs que apunte al arhivo .lib, por ejemplo:
+
De manera similar a lo que hicimos para cargar la biblioteca compartida, ahora debes configurar el [http://doc.qt.io/qt-4.8/qmake-variable-reference.html#includepath INCLUDEPATH] para que apunte al directorio donde se encuentran los headers y la variable [http://doc.qt.io/qt-4.8/qmake-variable-reference.html#libs LIBS] que apunte al arhivo .lib, por ejemplo:
  
'''useStaticLib.pro'''<br /><code><br />TEMPLATE = app<br />TARGET =<br />CONFIG+= console<br /># Input<br />SOURCES ''= main.cpp<br />INCLUDEPATH''= ../staticLibrary<br />LIBS+= -L../staticLibrary/debug -lstaticLibrary
+
'''useStaticLib.pro'''
 +
<syntaxhighlight lang="c++">
 +
TEMPLATE = app
 +
TARGET =
 +
CONFIG+= console
 +
# Input
 +
SOURCES ''= main.cpp
 +
INCLUDEPATH''= ../staticLibrary
 +
LIBS+= -L../staticLibrary/debug -lstaticLibrary
  
</code>
+
</syntaxhighlight>
  
'''main.cpp'''<br /><code><br />#include &lt;QtGui&amp;gt;<br />#include &quot;test.h&amp;quot;
+
'''main.cpp'''
 +
<syntaxhighlight lang="c++">
 +
#include <QtGui>
 +
#include "test.h"
  
int main(int argc, char *argv[])<br />{<br /> QApplication a(argc, argv);<br /> Widget w;<br /> w.resize(100,100);<br /> w.show();<br /> return a.exec&amp;amp;#40;&amp;#41;;<br />}<br /></code>
+
int main(int argc, char *argv[])
 +
{
 +
QApplication a(argc, argv);
 +
Widget w;
 +
w.resize(100,100);
 +
w.show();
 +
return a.exec();
 +
}
 +
</syntaxhighlight>
  
 
== Que enfoque utilizar ==
 
== Que enfoque utilizar ==
Line 75: Line 210:
 
El enfoque a elegir depende de tus necesidades. Cuando se crea una biblioteca compartida, usted necesita desplegarlas con su aplicación. El lado positivo es que las aplicacións enlazadas a bibliotecas compartidas son mas pequeñas. Cuando utilizar QLibrary para cargar el .dll o un enlace normal, depende de cuando usted tiene acceso a los headers y los arhivos .lib, si usted no tiene acceso a ellos, entonces QLibrary es una alternativa.
 
El enfoque a elegir depende de tus necesidades. Cuando se crea una biblioteca compartida, usted necesita desplegarlas con su aplicación. El lado positivo es que las aplicacións enlazadas a bibliotecas compartidas son mas pequeñas. Cuando utilizar QLibrary para cargar el .dll o un enlace normal, depende de cuando usted tiene acceso a los headers y los arhivos .lib, si usted no tiene acceso a ellos, entonces QLibrary es una alternativa.
  
Enlace estatico resulta en un ejecutable independiente. La ventaja es que usted solo necesita tener unos pocos archivos para desplegar. La desventaja es que los ejecutables son grandes. Mire el &quot;Deployment documentation&amp;quot;:http://doc-snapshot.qt.io/4.8/deployment.html para tener mas detalles sobre versiones compartidas y estaticas.
+
Enlace estatico resulta en un ejecutable independiente. La ventaja es que usted solo necesita tener unos pocos archivos para desplegar. La desventaja es que los ejecutables son grandes. Mire el [http://doc-snapshot.qt.io/4.8/deployment.html Deployment documentation] para tener mas detalles sobre versiones compartidas y estaticas.

Latest revision as of 18:52, 22 June 2021

EspañolEnglish

Introducción

Este tutorial ilustra diferentes enfoques para usar una biblioteca perzonalizada en tu aplicanción en Windows. La primera parte explica como crear una biblioteca compartida y como enlazarla en tu aplicación. La segunda parte es acerca de como crear y usar una biblioteca estatica.

Creando una biblioteca compartida

Cuando se crea una biblioteca compartida con la cual te gustaria enlazar tu aplicacion, debes asegurar que los simbolos que vas a usar fuera de la biblioteca son correctamente exportados cuando la biblioteca es creada. Posteriormente importada cuando estás enlazando la biblioteca. Esta puede ser hecho usando Q_DECL_EXPORT y Q_DECL_IMPORT como esta demostrado en el siguiente ejemplo:

test.h

#include <QtGui>

#if defined TEST
#define TEST_COMMON_DLLSPEC Q_DECL_EXPORT
#else
#define TEST_COMMON_DLLSPEC Q_DECL_IMPORT
#endif

class TEST_COMMON_DLLSPEC Widget : public QWidget
{
 Q_OBJECT
public:
 Widget();
};

test.cpp

#include <QtGui>
#include "test.h"

Widget::Widget() : QWidget()
{}

test.pro

TEMPLATE = lib
# Input
SOURCES ''= test.cpp
HEADERS''= test.h
DEFINES ''= TEST

Vea ademas la documentación en Creating Shared Libraries.

Enlazando su aplicación contra la biblioteca compartida

Con el fin de utilizar la biblioteca compartida en su aplicación, para que entonces usted pueda incluir los headers de su biblioteca y utilizar sus métodos. Compile enlazando con el arhivo .lib. En tiempo de ejecución esto carga el dll el cual tiene la implementación.

Para hacer esto, en el archivo .pro de su aplicación ustede necesita informar a la aplicación donde debe buscar los headers y la biblioteca. El INCLUDEPATH necesita apuntar al directorio donde los headers estan instalados, y la variable LIBS necesita apuntar al directorio del archivo .lib. Ademas usted necesita asegurar que el .dll es encontrado colocando en el directorio de la aplicación o en la variable global PATH.

Por ejemplo:

loadTestLib.pro

TEMPLATE = app
TARGET =
DEPENDPATH''= . ../testLib
INCLUDEPATH ''= ../testLib
LIBS''= -L../testLib/debug -ltestLib
# Input
SOURCES ''= main.cpp

main.cpp

#include <QtGui>
#include "test.h"

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 Widget w;
 w.resize(100,100);
 w.show();
 return a.exec();
}

Usando QLibrary para cargar la biblioteca compartida

QLibrary puede ser usado para cargar bibliotecas compartidas en tiempo de ejecución. En este caso usted solo necesitara tener accesi al .dll, acceso a los headers y el archivo .lib no es necesario.

El siguinte ejemplo muestra como configurar una biblioteca para utilizarla con QLibrary. Para que los nombres de las funciones puedan ser resueltos, los mismos deben ser como funciones de C (por ejemplo, sin el name mangling) de la biblioteca. Esto significa que las funciones deben estar dentro de un bloque extern "C" si la biblioteca es compilada con un compilador de C.

Desde que estamos haciendo esto en Windows, tambien debenmos exportar la funcion del DLL utilizando Q_DECL_EXPORT y Q_DECL_IMPORT

qlibraryLibrary.pro

TEMPLATE = lib
HEADERS''= widget.h
SOURCES ''= widget.cpp
DEFINES''= TEST

widget.h

#include <QtGui>

#if defined TEST
#define TEST_COMMON_DLLSPEC Q_DECL_EXPORT
#else
#define TEST_COMMON_DLLSPEC Q_DECL_IMPORT
#endif

extern "C" TEST_COMMON_DLLSPEC QWidget* createWidget1();

widget.cpp

#include <QtGui>
#include "widget.h"

QWidget* createWidget1()
{
 QWidget '''wid = new QWidget();
 wid->resize(100,100);
 return wid;
}

Cargando la biblioteca utilizando QLibrary

Para cargar la biblioteca utilizando QLibrary, usted simplemente debe pasar el .dll al constructor de QLibrary. Asegurese que el .dll esta disponible en el directorio de la aplicación o dentro de la variable global PATH. Para utilizar estas funciones de la biblioteca en su aplicación, usted necesita encontrarlas utilizando QLibrary::resolve().

El siguiente ejemplo carga la biblioteca creada arriba y utiliza una de sus funciones para crear y mostrar un widget.

#include <QtGui>

int main(int argc, charargv)
{
 QApplication app(argc, argv);
 QLibrary library("qlibraryLibrary.dll");
 if (!library.load())
 qDebug() << library.errorString();
 if (library.load())
 qDebug() << "library loaded";

 typedef QWidget'''('''CreateWidgetFunction)(void);
 CreateWidgetFunction cwf = (CreateWidgetFunction)library.resolve("createWidget1");
 if (cwf) {
 QWidget''' wid = cwf();
 if (wid)
 wid->show();
 } else {
 qDebug() << "Could not show widget from the loaded library";
 }
 return app.exec();
}

Creando una biblioteca estatica

Al crear una biblioteca estatica usted debe especificar la opción staticlib al CONFIG en el archivo .pro. En contraste al ejemplo de la biblioteca compartida, usted no necesita configurar nada especial para exportar e importar simbolos en su archivo .h, ya que la biblioteca sera construida dentro de la aplicación, por ejemplo:

test.pro

TEMPLATE = lib
CONFIG+= staticlib
# Input
HEADERS ''= test.h
SOURCES''= test.cpp

Usando la biblioteca estatica en su aplicación.

De manera similar a lo que hicimos para cargar la biblioteca compartida, ahora debes configurar el INCLUDEPATH para que apunte al directorio donde se encuentran los headers y la variable LIBS que apunte al arhivo .lib, por ejemplo:

useStaticLib.pro

TEMPLATE = app
TARGET =
CONFIG+= console
# Input
SOURCES ''= main.cpp
INCLUDEPATH''= ../staticLibrary
LIBS+= -L../staticLibrary/debug -lstaticLibrary

main.cpp

#include <QtGui>
#include "test.h"

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 Widget w;
 w.resize(100,100);
 w.show();
 return a.exec();
}

Que enfoque utilizar

El enfoque a elegir depende de tus necesidades. Cuando se crea una biblioteca compartida, usted necesita desplegarlas con su aplicación. El lado positivo es que las aplicacións enlazadas a bibliotecas compartidas son mas pequeñas. Cuando utilizar QLibrary para cargar el .dll o un enlace normal, depende de cuando usted tiene acceso a los headers y los arhivos .lib, si usted no tiene acceso a ellos, entonces QLibrary es una alternativa.

Enlace estatico resulta en un ejecutable independiente. La ventaja es que usted solo necesita tener unos pocos archivos para desplegar. La desventaja es que los ejecutables son grandes. Mire el Deployment documentation para tener mas detalles sobre versiones compartidas y estaticas.