Añadiendo biblioteca externa al proyecto Qt Creator


112

¿Cómo puedo agregar una biblioteca externa a un proyecto creado por Qt Creator RC1 (versión 0.9.2)? Por ejemplo, EnumProcesses()es Psapi.libnecesario agregar la función win32 en el proyecto para compilar.

Respuestas:


216

La forma correcta de hacer esto es así:

LIBS += -L/path/to -lpsapi

De esta forma, funcionará en todas las plataformas compatibles con Qt. La idea es que debe separar el directorio del nombre de la biblioteca (sin la extensión y sin ningún prefijo 'lib'). Por supuesto, si está incluyendo una biblioteca específica de Windows, esto realmente no importa.

En caso de que desee almacenar sus archivos lib en el directorio del proyecto, puede hacer referencia a ellos con la $$_PRO_FILE_PWD_variable, por ejemplo:

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi

2
¿Es posible especificar una variable de entorno como ruta de biblioteca? Lo pregunto porque escribir nombres de ruta codificados en el archivo .pro rompería las cosas si un proyecto es desarrollado por varias personas que pueden no tener todas las bibliotecas instaladas en las mismas ubicaciones.
antred

Esto funcionó para mí, pero cuando genero un proyecto vs qmake -tp vc, no encuentro nombres de libs en Additional Dependenciesel proyecto, pero el proyecto vs funciona bien. ¿Eso significa que hay otros métodos para agregar Additional Dependenciesvs?
Sol de verano

1
No creo que deba especificar una ruta para una biblioteca de Windows incorporada. Nuestros archivos .pro tienen líneas de este tipo en la sección de Win32: LIBS += -lGdi32.
Dan Korn

1
Como señaló @DanKorn, para las bibliotecas integradas de Windows no es necesario (ni debe) especificar una ruta.
fresa

¿Por qué no pueden simplemente hacer una GUI para agregar una biblioteca smh.
GeneCode

24

¿Estás usando qmakeproyectos? Si es así, puede agregar una biblioteca externa usando la LIBSvariable. P.ej:

win32:LIBS += path/to/Psapi.lib

1
Perdón por una pregunta poco convincente, pero ¿la biblioteca psapi ya debe estar precompilada o QtCreator se encargará de construirla?
Dfr

11

LIBS + = C: \ Archivos de programa \ OpenCV \ lib

no funcionará porque está utilizando espacios en blanco en Archivos de programa. En este caso, debe agregar comillas, por lo que el resultado se verá así: LIBS + = "C: \ Archivos de programa \ OpenCV \ lib" . Recomiendo colocar bibliotecas en ubicaciones sin espacios en blanco ;-)


Las versiones más recientes de Qt (Creator) siempre quieren barras diagonales (simples) como separador de directorios. La única excepción es cuando usa el comando "sistema" en Windows. Luego, debe alimentar el sistema con una barra inclinada hacia atrás escapada, es decir, dos barras inclinadas hacia atrás. Para reemplazar todas las barras inclinadas con dos barras inclinadas se puede hacer de la siguiente manera: WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag

6

El error al que se refiere se debe a que falta una ruta de inclusión adicional. Intente agregarlo con: INCLUDEPATH + = C: \ ruta \ a \ incluir \ archivos \ Espero que funcione. Saludos.


4

Y para agregar varios archivos de biblioteca, puede escribir lo siguiente:

INCLUDEPATH * = E: / DebugLibrary / VTK E: / DebugLibrary / VTK / Common E: / DebugLibrary / VTK / Filtering E: / DebugLibrary / VTK / GenericFiltering E: / DebugLibrary / VTK / Graphics E: / DebugLibrary / VTK / GUISupport Qt E: / DebugLibrary / VTK / Hybrid E: / DebugLibrary / VTK / Imaging E: / DebugLibrary / VTK / IO E: / DebugLibrary / VTK / Parallel E: / DebugLibrary / VTK / Rendering E: / DebugLibrary / VTK / Utilities E : / DebugLibrary / VTK / VolumeRendering E: / DebugLibrary / VTK / Widgets E: / DebugLibrary / VTK / Wrapping

LIBS * = -LE: / DebugLibrary / VTKBin / bin / liberar -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering


3

Si desea implementar su aplicación en las máquinas de los clientes, en lugar de usar su aplicación solo usted mismo, descubrimos que el LIBS+= -Lxxx -lyyymétodo puede generar confusión, si no problemas.

Desarrollamos aplicaciones para Linux, Mac y Windows usando Qt. Enviamos aplicaciones completas e independientes. Por lo tanto, todas las bibliotecas que no son del sistema deben incluirse en el paquete de implementación. Queremos que nuestros clientes puedan ejecutar la aplicación desde la misma memoria USB para todos los sistemas operativos. Por razones de compatibilidad con la plataforma, la memoria USB debe formatearse como FAT32, que no admite enlaces simbólicos (Linux).

Encontramos el LIBS+= -Lxxx -lyyyidioma demasiado de una caja negra:

  1. No sabemos exactamente cuál es la ruta de archivo de la biblioteca (estática o dinámica) que ha encontrado el enlazador. Esto es un inconveniente. Nuestro enlazador de Mac encontró regularmente bibliotecas diferentes de las que pensamos que deberían usarse. Esto sucedió varias veces con las bibliotecas de OpenSSL donde el enlazador de Mac encontró y usó su propia versión de OpenSSL, más antigua e incompatible, en lugar de la versión solicitada.

  2. No podemos permitirnos que el enlazador utilice enlaces simbólicos a bibliotecas, ya que esto rompería el paquete de implementación.

  3. Queremos ver a partir del nombre de la biblioteca si vinculamos una biblioteca estática o dinámica.

Entonces, para nuestro caso particular, usamos solo rutas de archivo absolutas y verificamos si existen. Eliminamos todos los enlaces simbólicos.

Primero averiguamos qué sistema operativo estamos usando y lo colocamos en la variable CONFIG. Y, por ejemplo, para Linux de 64 bits, entonces:

linux64 {
    LIBSSL= $$OPENSSLPATH/linux64/lib/libssl.a
    !exists($$LIBSSL): error ("Not existing $$LIBSSL")
    LIBS+= $$LIBSSL
    LIBCRYPTO= $$OPENSSLPATH/linux64/lib/libcrypto.a
    !exists($$LIBCRYPTO): error ("Not existing $$LIBCRYPTO")
    LIBS+= $$LIBCRYPTO
}

Todas las dependencias se pueden copiar en el paquete de implementación, ya que conocemos sus rutas de archivo.


1

Me gustaría agregar, en aras de la integridad, que también puede agregar solo la RUTA DE LA BIBLIOTECA donde buscará una biblioteca dependiente (que puede no estar referenciada directamente en su código, pero una biblioteca que usa puede necesitarla).

A modo de comparación, esto correspondería a lo que hace el entorno LIBPATH, pero es algo oscuro en Qt Creator y no está bien documentado.

La forma en que resolví esto es la siguiente:

LIBS += -L"$$_PRO_FILE_PWD_/Path_to_Psapi_lib/"

Básicamente, si no proporciona el nombre real de la biblioteca, agrega la ruta donde buscará las bibliotecas dependientes. La diferencia en la sintaxis es pequeña pero esto es muy útil para proporcionar solo la RUTA donde buscar bibliotecas dependientes. En algún momento, es solo una molestia proporcionar cada biblioteca individual de ruta donde sabe que están todas en una carpeta determinada y Qt Creator las recogerá.


0

en .pro: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

en .h / .cpp: #pragma comment(lib,"user32.lib")

#pragma comment(lib,"psapi.lib")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.