Error LNK2019 en proyectos de Visual Studio C ++ usando las funciones de LabWindows ™ / CVI ™

Actualizado el Nov 28, 2019

Reportado en

Software

  • LabWindows/CVI Base
  • LabWindows/CVI Full

Otros

Microsoft Visual Studio

Detalles del problema

Estoy tratando de usar las funciones de LabWindows / CVI en mi proyecto de Visual Studio C ++, pero cuando intento compilar mi código recibo errores de enlace (o errores del linker) similares a estos:

error LNK2019: unresolved external symbol

Solución

Para compilar las funciones de LabWindows / CVI en un programa Visual Studio C ++, primero debe compilar las funciones en una biblioteca de vínculos dinámicos ( .dll ) con una biblioteca de importación, y luego vincular la biblioteca de importación ( .lib ) a su C ++ proyecto. Para construir las funciones en una DLL y resolver los errores de enlace, complete los siguientes pasos:
  1. Si el controlador del instrumento que incluye las funciones no está ya cargado en LabWindows / CVI, deberá cargarlo yendo a Instrument>>Load. En el cuadro de diálogo que se abre, navegue hasta el archivo .fp que le interese y haga clic en Load.
  2. Abra el Editor del árbol de funciones y vaya a File>>Open>>Function Tree (*.fp) . En el cuadro de diálogo que se abre, navegue hasta el archivo .fp que le interese y haga clic en Load.
  3. Cree un proyecto de DLL yendo a  Options>>Create DLL Project . Especifique una ruta y un nombre para su proyecto y haga clic en Save. Aparecerá un mensaje preguntándole si desea cargar el proyecto DLL ahora, similar al cuadro de diálogo a continuación. Haga clic en Yes.
  1. Antes de compilar la DLL, deberá configurar algunas de las configuraciones de compilación. Primero establezca el tipo de objetivo de compilación yendo a Build>>Target Type y asegurándose de que haya una marca de verificación junto a Dynamic Link Library . También configure el proyecto en modo de liberación yendo a  Build>>Configuration y asegurándose de que haya una marca de verificación junto a la Release.
  2. Vaya a  Build>>Target Settings y cambie la siguiente configuración:
    1. Cambie la opción de Run-time support al Full run-time engine , como se muestra en la imagen a continuación
  1. Cambie la configuración de la biblioteca de tipos haciendo clic en Type Library y desactivando Add type library resource to DLL . Si no desactiva esta opción, puede encontrarse con un error como este al intentar compilar: no se pudieron encontrar las definiciones para estos tipos. (o bien Definitions for these types could not be found.)

Luego haga clic en Aceptar para salir de ambas ventanas.
  1. Construye el DLL. En LabWindows / CVI 2012 o anterior, seleccione Build>>Create Release Dynamic Link Library.. En LabWindows / CVI 2013, seleccione Build>>Build . Esto creará una biblioteca de vínculos dinámicos ( .dll ) y una biblioteca de importación ( .lib ) que contiene las funciones de LabWindows / CVI que está intentando usar. Ahora podemos vincular la biblioteca de importación al proyecto de Visual Studio.
  2. Abra su proyecto de Visual Studio C ++ y vaya a Project>> Properties . En la ventana Propiedades, vaya a Configuration Properties>>C/C++>>General. Haga clic en el campo Additional Include Directories. Luego haga clic en la flecha que aparece y seleccione <Edit> .
  1. En el cuadro de diálogo que se abre, haga clic en el botón New Line, agregue el directorio que contiene el archivo de encabezado y haga clic en Ok.
  1. Vaya a Configuration Properties>>Linker>>Input . Haga clic en el campo Additional Dependencies y luego haga clic en la flecha que aparece y seleccione <Edit ...> .
  1. En el cuadro de diálogo que se abre, agregue la ruta de la biblioteca de importación a la lista de Additional Dependencies..
  1. Compile su proyecto de Visual Studio, y los errores de enlace deben ser resueltos. Si aún observa errores de vinculación, es posible que su proyecto dependa de más de una biblioteca de funciones de LabWindows / CVI. En este caso, deseará repetir estos pasos para las otras bibliotecas.

Información adicional

Si las funciones que intenta utilizar ya están agrupadas en una DLL con una biblioteca de importación, puede omitir los pasos 1 a 6.

Si aún tiene un error de enlace, probablemente se deba a un problema de manipulación de nombres . El lenguaje C ++ le permite superar algunas funciones (como los métodos en Programación Orientada a Objetos). Para resolver algunos conflictos de nombres, el compilador de C ++ agrega la gestión de nombres para tener un identificador de nombre único.
Entonces, cuando llama a una biblioteca C en el programa C ++, el compilador de C ++ necesita saber que no necesita modificar el nombre. Si es así, el nombre creado por el compilador de C ++ es diferente de lo que está en su código C y explica el error de vinculación.
Para resolverlo, debe agregar el siguiente código en el archivo de encabezado (.h) relacionado con su archivo .c.
#ifdef __cplusplus
extern "C" {
#endif
     /* Las funciones que quiero conservar igual en C y C++ */
#ifdef __cplusplus
}
#endif