strongly - ¿Cómo uso un archivo DLL de terceros en Visual Studio C++?
strongly named key (6)
Entiendo que necesito usar LoadLibrary (). Pero, ¿qué otros pasos debo tomar para usar un archivo DLL de terceros?
Simplemente salté a C ++ y esta es la única parte que no entiendo (como programador de Java). Solo estoy viendo cómo puedo usar una biblioteca Qt y tesseract-ocr, pero el proceso no tiene sentido para mí y es muy difícil de googlear.
¿Cómo le digo al compilador de las funciones que estoy usando? ¿Debería haber un archivo de inclusión del proveedor externo?
Como todos dicen, LoadLibrary es la forma más difícil de hacerlo, y casi nunca es necesario.
La DLL debería haber venido con un archivo .lib para vincular, y uno o más archivos de encabezado para #incluir en sus fuentes. Los archivos de encabezado definirán las clases y los prototipos de función que puede usar desde la DLL. Lo necesitará incluso si usa LoadLibrary.
Para vincular con la biblioteca, es posible que deba agregar el archivo .lib a la configuración del proyecto en Vinculador / Entrada / Dependencias Adicionales.
Estas son dos formas de usar un archivo DLL en Windows:
Hay una biblioteca de stub (.lib) con archivos de encabezado asociados. Cuando vincula su ejecutable con el archivo lib, cargará automáticamente el archivo DLL al iniciar el programa.
Cargando la DLL manualmente Normalmente, esto es lo que quiere hacer si está desarrollando un sistema de complementos en el que hay muchos archivos DLL que implementan una interfaz común. Consulte la documentación de LoadLibrary y GetProcAddress para obtener más información al respecto.
Para Qt, sospecho que hay encabezados y una biblioteca estática disponible que puede incluir y vincular en su proyecto.
Para incorporar archivos DLL de terceros en mi proyecto VS ++ C ++, hice lo siguiente (debería poder traducir a 2010, 2012, etc.) ...
Puse los archivos de encabezado en mi solución con mis otros archivos de encabezado, realicé cambios en mi código para llamar a las funciones de las DLL (de lo contrario, ¿por qué haríamos todo esto?). : ^) Luego cambié la construcción para vincular el código LIB en mi EXE, para copiar las DLL en su lugar, y para limpiarlas cuando hice una ''limpieza'' - explico estos cambios a continuación.
Supongamos que tiene 2 archivos DLL de terceros, A.DLL y B.DLL, y tiene un archivo .bt stub para cada uno (A.LIB y B.LIB) y archivos de encabezado (AH y BH).
- Cree un directorio "lib" en su directorio de soluciones, por ejemplo, usando Windows Explorer.
- Copie los archivos .LIB y .DLL de terceros en este directorio
(Tendrá que hacer el siguiente conjunto de cambios una vez para cada objetivo de compilación de origen que use (depuración, versión)).
Haga que su EXE dependa de los archivos LIB
- Vaya a Propiedades de Configuración -> Enlazador -> Entrada -> Dependencias Adicionales, y haga una lista de sus archivos .LIB uno a la vez, separados por espacios :
A.LIB B.LIB
- Vaya a Propiedades de configuración -> General -> Directorios de biblioteca adicionales, y agregue su directorio "lib" a cualquiera que ya tenga allí. Las entradas están separadas por punto y coma . Por ejemplo, si ya tenía
$(SolutionDir)fodder
allí, lo cambia a$(SolutionDir)fodder;$(SolutionDir)lib
para agregar "lib".
- Vaya a Propiedades de Configuración -> Enlazador -> Entrada -> Dependencias Adicionales, y haga una lista de sus archivos .LIB uno a la vez, separados por espacios :
Forzar a los archivos DLL a copiarse en el directorio de salida
- Vaya a Propiedades de configuración -> Eventos de compilación -> Evento posterior a la compilación
- Ponga lo siguiente para Línea de Comando (para los significados del interruptor, vea "XCOPY /?" En una ventana de DOS):
XCOPY "$(SolutionDir)"/lib/*.DLL "$(TargetDir)" /D /K /Y
- Puede poner algo como esto para la Descripción:
Copy DLLs to Target Directory
- Excluido de Build debería ser
No
Haga clic enOK
.
Indique a VS que limpie los archivos DLL cuando limpie una carpeta de salida:
- Vaya a Propiedades de Configuración -> General -> Extensiones para Eliminar al Limpiar, y haga clic en "..."; agregue
*.dll
al final de la lista y hagaOK
enOK
.
- Vaya a Propiedades de Configuración -> General -> Extensiones para Eliminar al Limpiar, y haga clic en "..."; agregue
Para usar Qt con enlace dinámico, debe especificar los archivos lib
(generalmente qtmaind.lib
, QtCored4.lib
y QtGuid4.lib
para la QtGuid4.lib
de "Depuración") en
Properties » Linker » Input » Additional Dependencies
.
También debe especificar la ruta donde están las libs , es decir, en
Properties » Linker » General » Additional Library Directories
.
Y debe hacer que los .dll
correspondientes estén disponibles en tiempo de ejecución, ya sea almacenándolos en la misma carpeta que su .exe
o en una carpeta que esté en su ruta .
Si supuestamente puede usarlo, la biblioteca de terceros debe tener un archivo * .lib y un archivo * .dll. Simplemente necesita agregar * .lib a la lista de archivos de entrada en las opciones de ''Enlazador'' de su proyecto.
Este archivo * .lib no es necesariamente una biblioteca ''estática'' (que contiene código): en su lugar, un * .lib puede ser solo un archivo que vincula su ejecutable a la DLL.
Solo necesita usar LoadLibrary si desea enlazar tarde y solo resolver las funciones importadas en tiempo de ejecución. La forma más fácil de usar un DLL de terceros es vincularlo con .lib.
En respuesta a su edición:
Sí, la API de terceros debe consistir en un dll y / o una lib que contenga la implementación y los archivos de encabezado que declaran los tipos requeridos. Necesitas saber las definiciones de tipo, cualquiera que sea el método que uses, para LoadLibrary necesitarás definir punteros de función, para que puedas escribir fácilmente tu propio archivo de encabezado. Básicamente, solo necesita usar LoadLibrary si desea vincularlo tarde. Una razón válida para esto sería si no está seguro si el dll estará disponible en la PC de destino.