2009-01-30 14 views
58

Entiendo que necesito usar LoadLibrary(). Pero, ¿qué otros pasos debo tomar para usar un archivo DLL de terceros?¿Cómo uso un archivo DLL de terceros en Visual Studio C++?

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?

+0

¿Entiende cómo agregar el archivo DLL de terceros en Visual Studio 2012 para C++. Por favor, ayúdame con esto. – afzalex

Respuesta

59

Como todos los demás dicen, LoadLibrary es la manera más difícil de hacerlo, y casi nunca es necesario.

La DLL debe 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.

+1

Gracias, las otras respuestas fueron muy buenas (y útiles para mí también) pero esto explica exactamente lo que estaba buscando. – Zombies

+0

El cuadro de diálogo 'dependencias adicionales' parece que solo admite nombres de archivo y extensiones, no rutas de archivos. Al agregar el nombre de archivo + la extensión no se corrigieron los errores del 'identificador no encontrado'. Agregar la ruta de acceso completa + nombre de archivo + tampoco los corrigió. – anon58192932

+0

@advocate, hay una entrada para "Directorios de biblioteca adicionales" en la pestaña "General". No tengo idea de por qué Microsoft los separó. –

24

Estas son dos formas de utilizar un archivo DLL en Windows:

  1. hay una biblioteca de código auxiliar (lib) con archivos de cabecera asociados. Cuando vincula su ejecutable con el archivo lib, cargará automáticamente el archivo DLL al iniciar el programa.

  2. 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 para 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.

+0

Y hay una tercera forma, similar a su primera manera, usando el interruptor '/ MT', que enlazará estáticamente sus bibliotecas. La ventaja es que [no existe una sobrecarga dinámica de enlace] (http://www.codeproject.com/Articles/85391/Microsoft-Visual-C-Static-and-Dynamic-Libraries#StaticLibraryProperties). Sin embargo, esto no se puede usar si también usa el interruptor '/ clr'. – Abel

+2

Eso solo se aplica a la biblioteca estándar. Para las bibliotecas personalizadas (de terceros), no puede vincular un dll estáticamente a menos que alguien haya creado explícitamente una versión estática del mismo que pueda vincular. – Laserallan

2

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 simplemente un archivo que vincula su ejecutable a la DLL.

3

Solo necesita utilizar 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 tercera parte de la API debe consistir en un DLL y/o una librería que contienen los archivos de aplicación y de cabecera que declara 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.

6

Para utilizar Qt con la vinculación dinámica tiene que especificar los archivos lib (por lo general qtmaind.lib, QtCored4.lib y QtGuid4.lib para la configration "depuración") en
Properties » Linker » Input » Additional Dependencies.

también hay que especificar la ruta en las librerías son, es decir, en
Properties » Linker » General » Additional Library Directories.

y hay que tomar las correspondientes .dll s son accesibles en tiempo de ejecución, por cualquiera de ellos almacenar en la misma carpeta que el .exe o en una carpeta que es en su camino.

51

Incorporar DLL de terceros en mi proyecto VS 2008 C++ hice lo siguiente (que debería ser capaz de traducir en 2010, 2012, etc.) ...

puse los archivos de cabecera en mi solución con mis otros archivos de cabecera, hicieron 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 (A.H y B.H).

  • Cree un directorio "lib" en su directorio de soluciones, p. usando Windows Explorer.
  • copiar los archivos .lib y .DLL de terceros en este directorio

(Vas a tener que hacer la siguiente serie de cambios una vez para cada tipo de generación de origen que utiliza (debug, release).)

  1. hacer depender el archivo EXE en los archivos de LIB

    • ir a las características de configuración -> Enlazador -> entrada -> dependencias adicionales, y la lista de sus archivos .LIB hay uno a la vez, separa ted by 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 ahí, lo cambia a $(SolutionDir)fodder;$(SolutionDir)lib para agregar "lib".
  2. vigor las DLL para ser copiado en el directorio de salida

    • Vaya a Configuración Propiedades -> Eventos de generación -> posterior a la generación de eventos
    • Ponga lo siguiente en la Línea de Comando (para el cambiar significados, ver "XCOPY /?"En una ventana de DOS):

    XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y

    • Usted puede poner algo como esto durante Descripción:

    Copy DLLs to Target Directory

    • excluidos de construcción debe ser No . Haga clic en OK.
  3. Dile a VS para limpiar los archivos DLL cuando se limpia una carpeta de salida:

    • Vaya a Configuración Propiedades -> General -> Extensiones para Eliminar en Limpio, y haga clic en "..." ; agregue *.dll al final de la lista y haga clic en OK.
+1

Estoy tratando de usar su método para usar dll's de terceros. Estoy usando Visual Studio 2012 ultimate y no tiene 'Directories Library Directories' en' Configuration Properties -> General' tab. Por favor, ayúdame. – afzalex

+3

Debería ser 'Propiedades de configuración -> Enlazador -> General -> Directorios de biblioteca adicionales'. –

+0

@afzalex puede encontrarlo en Propiedades de configuración> Directorios de VC++> Directorios de biblioteca. Es un turno de generación;) – Bokhari

Cuestiones relacionadas