Use la biblioteca de optimización no lineal de Ceres en el sistema de Windows: (1) Instale la biblioteca de Ceres

(1) Instalar la biblioteca Ceres

        1. Instale la biblioteca Ceres con vcpkg

                1.1 Instalar vcpkg

                1.2 Instalar Ceres

                1.3 Configurar Ceres

        2. Instale la biblioteca Ceres con Virtual Studio

                2.1 Descargar ceres-windows

                2.2 Abrir o actualizar una solución

                2.3 Compilar el proyecto libglog_static

                2.4 Compilar el proyecto ceres_static y ceres

                2.5 Rutina de compilación

                2.6 Comprensión profunda del proceso de compilación y vinculación

        3. Instale la biblioteca Ceres con CMake

(2) Llame a la biblioteca de Ceres

(3) Liberar la aplicación

Ceres, traducido como Ceres, es un planeta enano del sistema solar. Fue observado por primera vez por el sacerdote italiano Piazzi en 1801, pero luego Piazzi perdió su órbita debido a una enfermedad. Unos meses más tarde, el matemático alemán Gauss predijo con éxito la trayectoria de Ceres utilizando el método de los mínimos cuadrados y basándose únicamente en los 12 datos observados antes por Piazzi.

Más de doscientos años después, para resolver algunos problemas complejos de optimización (como mínimos cuadrados no lineales con restricciones de contorno, optimización general sin restricciones, etc.), Google desarrolló una biblioteca de C++ Ceres Solver. La razón por la que se llama Ceres Solver es para conmemorar el uso de Gauss del método de mínimos cuadrados para predecir con éxito la trayectoria de Ceres, que es un evento de gran importancia en la historia de la optimización, la estadística y la astronomía.

Dentro de Google, Ceres ha sido utilizado en múltiples productos, tales como: estimación de pose de autos y aeronaves en Google Street View; establecimiento de modelos 3D en PhotoTours; algoritmo SLAM Cartographer, etc. Además, algunas empresas e institutos de investigación también están utilizando Ceres, como la calibración del sistema de visión robótica del Southwest Research Institute, el problema de ajuste de haz (BA) de OpenMVG, el problema SLAM de Willow Garage, etc.

Soy un profesional de SLAM y siempre he instalado y usado la biblioteca Ceres en el sistema Linux, ya sea que instale o descargue el código fuente y lo compile con CMake, es bastante simple. Sin embargo, hay un proyecto reciente que necesita instalar y usar la biblioteca Ceres en el sistema de Windows y se encontró que instalar y usar la biblioteca Ceres en Windows es mucho más complicado que en Linux. Escribir este blog es registrar los diversos pozos que he pisado, con la esperanza de ayudar a otros más adelante.

 (1) Instalar la biblioteca Ceres

Para instalar la biblioteca de Ceres, recomiendo mirar directamente el tutorial oficial ( Instalación — Ceres Solver ), que es muy detallado. El funcionario ofrece 3 formas de instalar la biblioteca Ceres en el sistema de Windows:

  • Instale la biblioteca Ceres con vcpkg.
  • Instale la biblioteca Ceres con Virtual Studio.
  • Instale la biblioteca Ceres con CMake.

Instalar la biblioteca de Ceres con vcpkg es muy simple, casi una instalación con un solo clic, pero la desventaja es que no puede seleccionar manualmente la versión de Ceres y sus dependencias, y algunas otras opciones de compilación no se pueden modificar. En la aplicación posterior, las opciones de edición deben modificarse, obviamente el método vcpkg no puede cumplir con los requisitos. Instalar la biblioteca Ceres con Virtual Studio es crear un nuevo proyecto C++ en Virtual Studio, luego colocar Ceres y su código fuente dependiente descargado de Internet en la ubicación correspondiente del proyecto C++ recién creado y luego compilar estos proyectos C++ para generar la biblioteca estática Lib que necesitamos y la biblioteca dinámica Dll. De esta forma, puedes seleccionar manualmente la versión de Ceres y sus dependencias, y también puedes modificar las opciones de compilación. El uso de CMake para instalar la biblioteca Ceres, en comparación con el uso de Virtual Studio para instalar la biblioteca Ceres, tiene la ventaja de que se puede compilar en función del proyecto CMake, que es muy liviano y tiene buena portabilidad, pero la desventaja es que el proceso de configuración es muy complicado. Por lo tanto, recomiendo instalar la biblioteca Ceres con Virtual Studio.

1. Instale la biblioteca Ceres con vcpkg

vcpkg es un administrador de paquetes de código abierto multiplataforma para bibliotecas C y C ++ desarrollado por el equipo de Microsoft C ++. Simplifica enormemente las operaciones de descarga y configuración relacionadas con bibliotecas de terceros en Windows, Linux y macOS. Actualmente hay más de 1,600 terceros -party library Las bibliotecas se pueden instalar a través de vcpkg. vcpkg es en realidad algo similar al administrador de paquetes apt de Linux y al administrador de paquetes pip de Python.

1.1 Instalar vcpkg

Con respecto a la instalación y uso de vcpkg, el tutorial oficial ( vcpkg/README_zh_CN.md at master · microsoft/vcpkg · GitHub ) para instalar vcpkg en el sistema Windows ya está muy detallado, así que hablaré brevemente sobre esto aquí. La primera es descargar el paquete de instalación de vcpkg en nuestra computadora con Windows y luego simplemente ejecutar el paquete de instalación. Primero instale el cliente Git en su computadora con Windows y luego use Git para descargar el paquete de instalación de vcpkg; no importa si no tiene Git instalado, solo vaya directamente al github de vcpkg para descargar el paquete de instalación y luego instálelo .

Aquí se supone que Git ya existe, abra directamente el terminal de comando CMD de su computadora con Windows como administrador e ingrese el siguiente comando para instalar vcpkg:

> git clone https://github.com/microsoft/vcpkg
> .\vcpkg\bootstrap-vcpkg.bat

1.2 Instalar Ceres

Continúe usando el siguiente comando para instalar la biblioteca C/C++ que necesita en el terminal de comandos CMD. Para el uso específico de vcpkg, puede usar el comando de ayuda vcpkg help para ver el tutorial. Aquí, primero use el comando de búsqueda vcpkg para consulta la situación del paquete ceres que queremos instalar:

> CD vcpkg\vcpkg
> vcpkg search ceres

 De los resultados de la consulta anterior, la versión de ceres en el almacén de vcpkg es 2.1.0, y hay otras versiones de ceres (como ceres[cuda], ceres[cxsparse], etc.). Además, los paquetes en vcpkg se dividen en 32 bits y 64 bits, y el valor predeterminado es instalar 32 bits. Si desea utilizar este paquete en aplicaciones de 32 y 64 bits, debe instalar ambas:

#安装ceres 32位版本的命令
> vcpkg install ceres
#安装ceres 64位版本的命令
> vcpkg install ceres:x64-windows

La versión de ceres instalada directamente arriba es el método de solución DENSE_QR utilizado al realizar iteraciones de optimización. No se requieren las versiones ceres[cxsparse], ceres[suitesparse], ceres[eigensparse] y otras. Si estas versiones están instaladas, se utiliza el método de solución SPARSE_NORMAL_CHOLESKY de SuiteSparse o CXSparse o la opción de descomposición de Cholesky dispersa de Eigen al realizar iteraciones de optimización. Cuando la matriz del problema a resolver es relativamente escasa, la eficiencia de solución de este último es obviamente mayor que la del primero. Por lo tanto, puede elegir si desea instalar estas versiones no esenciales de acuerdo con sus necesidades.El método de instalación es el siguiente:

#安装ceres 32位版本的命令
> vcpkg install ceres[cxsparse] --recurse
> vcpkg install ceres[suitesparse] --recurse
> vcpkg install ceres[eigensparse] --recurse
#安装ceres 64位版本的命令
> vcpkg install ceres[cxsparse]:x64-windows --recurse
> vcpkg install ceres[suitesparse]:x64-windows --recurse
> vcpkg install ceres[eigensparse]:x64-windows --recurse

Finalmente, una vez completada la instalación, usamos el comando vcpkg list para ver los paquetes instalados.Podemos encontrar que el paquete ceres está instalado y sus dependencias correspondientes (como Eigen, glog, gflags, etc.) también se instalan automáticamente.

 1.3 Configurar Ceres

Aunque la biblioteca Ceres se instaló anteriormente, cuando escribimos un programa C++ para llamar a la biblioteca Ceres, necesitamos configurar los directorios include y lib involucrados en la biblioteca Ceres y especificar algunos atributos de enlace en nuestro programa, lo cual es muy inconveniente. A continuación se explica cómo configurar Ceres en varios casos. Estoy usando el entorno de win10+VS2022 aquí, y el entorno de otras versiones es similar.

(1) Los proyectos que no son de CMake en Visual Studio usan la configuración de la biblioteca Ceres

El proyecto de C++ recién creado en Visual Studio es un proyecto que no es de CMake de forma predeterminada. Podemos configurar todas las bibliotecas instaladas en vcpkg en el ámbito global de Visual Studio, de modo que las bibliotecas instaladas en vcpkg sean como la biblioteca estándar del sistema C/C++. Podemos llamarlo directamente con #include <xxx> en cualquier nuevo proyecto de C++ en Visual Studio sin configuración adicional. El método de configuración de la biblioteca en vcpkg para el ámbito global de Visual Studio, como se muestra en el siguiente comando:

#将vcpkg安装到Visual Studio全局范围
> vcpkg integrate install
#将vcpkg从Visual Studio全局范围卸载
> vcpkg integrate remove

A veces, es posible que desee utilizar diferentes versiones de algunas bibliotecas en diferentes proyectos, por lo que no puede configurar vcpkg en el ámbito global de Visual Studio. En este momento, puede empaquetar vcpkg en nuget y luego cargar la biblioteca en vcpkg a través de nuget en un proyecto específico de Visual Studio, por lo que la flexibilidad es muy alta. Si la versión de la biblioteca correspondiente de vcpkg no es la que quiere nuestro proyecto, el proyecto puede instalar y configurar la biblioteca manualmente sin cargar vcpkg. El método de configuración de la biblioteca en vcpkg para el ámbito local de Visual Studio, como se muestra en el siguiente comando:

> vcpkg integrate project

A continuación, abra Visual Studio, haga clic en la barra de menú: Herramientas->Administrador de paquetes NuGet->Configuración del administrador de paquetes, busque "Fuente del paquete" en la interfaz de configuración y agréguele vcpkg. Rellene la columna del nombre de forma casual, he rellenado vcpkg aquí, por lo que es fácil de encontrar cuando lo use más tarde. En la columna fuente, complete la ruta del archivo generado después de ejecutar el comando anterior, como C:\<replace with your real path>\vcpkg\vcpkg\scripts\buildsystems. Finalmente, haga clic en Aceptar.

  Si desea utilizar el paquete en vcpkg en un proyecto de la solución de Visual Studio, solo necesita instalar vcpkg con nuget en el proyecto, como el siguiente. Si no lo necesita más tarde, simplemente haga clic en Desinstalar.

 (2) El proyecto CMake en Visual Studio utiliza la configuración de la biblioteca Ceres

El proyecto de C++ recién creado en Visual Studio es un proyecto que no es de CMake de forma predeterminada, lo que significa que este proyecto de C++ depende de los archivos de proyecto *.sln o *.vcxproj, lo que significa que no se puede separar del entorno de desarrollo de Visual Studio. El nuevo proyecto CMake C++ en Visual Studio es un proyecto C++ multiplataforma que no depende de los archivos de proyecto *.sln o *.vcxproj. Si desea utilizar la biblioteca Ceres en el proyecto CMake C++ en Visual Studio, abra la opción de configuración de CMake del proyecto y agregue la ruta del archivo de la cadena de herramientas vcpkg al archivo de la cadena de herramientas CMake, de la siguiente manera:

[vcpkg root]/scripts/buildsystems/vcpkg.cmake

(3) El proyecto CMake que no es de Visual Studio utiliza la configuración de la biblioteca Ceres

Si desea utilizar la biblioteca Ceres en un proyecto CMake C++ en un entorno de desarrollo que no sea de Visual Studio, debe utilizar el siguiente archivo de cadena de herramientas para la configuración de comandos al compilar el proyecto con el comando CMake:

> cmake -B [build directory] -S . "-DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake"
> cmake --build [build directory]

Además, en CMake, aún necesita usar find_package para usar la biblioteca instalada en vcpkg.

2. Instale la biblioteca Ceres con Virtual Studio

Aunque es sencillo instalar la biblioteca Ceres con vcpkg, es muy inflexible. Por lo tanto, elijo un método más flexible aquí. Instale la biblioteca Ceres con Virtual Studio, es decir, cree un nuevo proyecto C++ en Virtual Studio y luego coloque Ceres y su código fuente dependiente descargado de Internet en la ubicación correspondiente del proyecto C++ recién creado Luego compile estos proyectos C++ para generar la biblioteca estática Lib y la biblioteca dinámica Dll que necesitamos. De esta forma, puedes seleccionar manualmente la versión de Ceres y sus dependencias, y también puedes modificar las opciones de compilación.

2.1 Descargar ceres-windows

Si no sabe cómo crear un nuevo proyecto de C++ en Virtual Studio y luego configurar y compilar el código fuente de Ceres, puede ir al tutorial oficial para descargar el proyecto de Virtual Studio listo para usar. La dirección de descarga es la siguiente:

 Podemos encontrar que la carpeta ceres-windows que acabamos de descargar arriba es en realidad una plantilla, y las carpetas ceres-solver, Eigen y glog están vacías. Por lo tanto, tenemos que descargar los códigos fuente de ceres-solver, Eigen y glog por separado y luego descomprimirlos en las carpetas correspondientes en ceres-windows. La versión del código fuente que descargué aquí es la siguiente:

2.2 Abrir o actualizar una solución

Se puede encontrar que hay 3 archivos de solución en la carpeta ceres-windows: ceres-2010.sln, ceres-2012.sln, ceres-2015.sln. Seleccione la solución correspondiente a la versión de Virtual Studio en su computadora y ábrala.Si su versión de Virtual Studio es superior a la versión 2015 (por ejemplo, uso Virtual Studio 2022), abra directamente la solución ceres-2015.sln y presione Aceptar Los siguientes pasos de operación para completar la actualización automática de la versión de la solución.

Además, recuerde ir a las propiedades de la solución y establecer la configuración (Debug/Release) y la plataforma (x64/Win32) de la solución y cada proyecto en un modo unificado, si no están unificados, se informará un error más adelante cuando compilando He configurado uniformemente los modos de Release y Win32 aquí, como se muestra a continuación.

 Antes de comenzar oficialmente a compilar, puede ir a las propiedades de la solución para ver las dependencias entre los distintos proyectos.

 Puede encontrar las dependencias entre los distintos proyectos en nuestra solución. El proyecto libglog_static no depende de otros proyectos. El proyecto libglog_static es el proyecto utilizado para crear la biblioteca Lib estática de C++. Tanto el proyecto ceres_static como ceres dependen del proyecto libglog_static, el proyecto ceres_static se usa para crear la biblioteca Lib de C++ estática y el proyecto ceres se usa para crear la biblioteca Dll de C++ dinámica. Otros proyectos (curve_fitting, curve_fitting_c, ellipse_approximation, helloworld, helloworld_analytic_diff, helloworld_numeric_diff, helloworld_static, robust_curve_fitting, simple_bundle_adjuster) son rutinas que dependen de ceres_static o ceres. Las dependencias específicas son las siguientes:

 Según las dependencias entre proyectos, primero debemos compilar el proyecto libglog_static, luego compilar los proyectos ceres_static y ceres, y finalmente compilar los proyectos de rutina (curve_fitting, curve_fitting_c, ellipse_approximation, helloworld, helloworld_analytic_diff, helloworld_numeric_diff, helloworld_static, robust_curve_fitting, simple_bundle_adjuster) .

2.3 Compilar el proyecto libglog_static

Seleccione directamente el proyecto libglog_static, luego haga clic derecho y seleccione "Generar" en la lista del menú emergente para comenzar a compilar. Una vez completada la compilación, según la ruta de salida configurada en las propiedades del proyecto, el archivo de biblioteca estática compilado libglog_static.lib se almacena en la ruta "<carpeta de su solución>\Win32\Release\".

2.4 Compilar el proyecto ceres _static y ceres

Como arriba, seleccione directamente el proyecto, luego haga clic derecho y seleccione "Generar" en la lista del menú emergente para comenzar a compilar. Una vez completada la compilación, de acuerdo con la ruta de salida configurada en las propiedades del proyecto, el archivo de biblioteca estática ceres_static.lib y el archivo de biblioteca dinámica ceres.dll generados por el proyecto ceres_static y ceres aún se almacenan en la ruta "<carpeta de su solución >\Win32\Release\". En este punto, los archivos de biblioteca libglog_static.lib, ceres_static.lib y ceres.dll que se usarán en la rutina estarán listos.

2.5 Rutina de compilación

Otros proyectos en la solución (curve_fitting, curve_fitting_c, ellipse_approximation, helloworld, helloworld_analytic_diff, helloworld_numeric_diff, helloworld_static, robust_curve_fitting, simple_bundle_adjuster) son todas rutinas, es decir, para que pruebe la biblioteca ceres, vea la compilación e instalación de la biblioteca ceres ¿Es correcto?

(1) Compilar la rutina helloworld

Seleccione el proyecto directamente, luego haga clic derecho y seleccione "Generar" en la lista del menú emergente para comenzar a compilar. Sin embargo, la compilación encontrará el error "C4996", de la siguiente manera:

 La solución es agregar macros en la configuración de propiedades del proyecto, propiedades de configuración> C/C++> preprocesador> definiciones de preprocesador, y luego agregar las siguientes macros:

_CRT_NONSTDC_NO_DEPRECATE

Entonces "regenerar" es suficiente.Después de que la compilación sea exitosa, se generará el archivo ejecutable helloworld.exe. Según la ruta de salida configurada en las propiedades del proyecto, el archivo ejecutable compilado helloworld.exe se almacena en la ruta "<carpeta de su solución>\Win32\Release\". Simplemente haga doble clic en helloworld.exe para ejecutar esta rutina y ver el resultado de la operación. Pero la consola parpadeará porque el programa sale inmediatamente después de ejecutarse. Puede ejecutar esta rutina en Virtual Studio sin fallar. Es decir, seleccione el proyecto helloworld en Virtual Studio, luego haga clic con el botón derecho en > depurar > iniciar una nueva instancia y los resultados de la ejecución son los siguientes:

 (2) Compile la rutina helloworld_static

Como se indicó anteriormente, la compilación encontrará el error "C4996". La solución es agregar una macro en la configuración de propiedades del proyecto, de la siguiente manera:

_CRT_NONSTDC_NO_DEPRECATE

Entonces "regenerar" es suficiente.Después de que la compilación sea exitosa, se generará el archivo ejecutable helloworld_static.exe. De acuerdo con la ruta de salida configurada en las propiedades del proyecto, el archivo ejecutable compilado helloworld_static.exe se almacena en la ruta "<carpeta de su solución>\Win32\Release\". Simplemente haga doble clic en helloworld_static.exe para ejecutar esta rutina y ver el resultado de la operación. Pero la consola parpadeará porque el programa sale inmediatamente después de ejecutarse. Puede ejecutar esta rutina en Virtual Studio sin fallar. Es decir, seleccione el proyecto helloworld en Virtual Studio, luego haga clic con el botón derecho en > depurar > iniciar una nueva instancia y el resultado de la ejecución es el mismo que el anterior.

Permítanme hablar sobre la diferencia entre los dos proyectos helloworld y helloworld_static,

2.6 Comprensión profunda del proceso de compilación y vinculación

Para garantizar que los programas desarrollados por nosotros mismos puedan tener una mejor compatibilidad cuando se envían a los usuarios, hay muchos elementos de configuración a los que se debe prestar atención durante el proceso de desarrollo del programa. Aquí, combinaremos los dos elementos anteriores de helloworld y helloworld_static para discutir en profundidad sobre el proceso de compilación del programa y enlace para el proceso completo.

(1) La unidad de configuración y selección de plataforma

Recuerde ir a las propiedades de la solución y poner la configuración (Debug/Release) y plataforma (x64/Win32) de la solución y cada proyecto a un modo unificado, si no están unificados se reportará un error más adelante al compilar. Lo configuré en los modos Release y Win32 de manera uniforme aquí.

De hecho, los archivos ejecutables *.exe compilados por Debug and Release pueden ejecutarse normalmente. El programa compilado por Debug se agregará con algunas cosas relacionadas con la depuración, por lo que el archivo de programa de la versión Debug será más grande. Por supuesto, el programa de la versión Debug La eficiencia operativa también es menor que la de Release. Por lo tanto, generalmente es la versión de lanzamiento cuando el programa de software se lanza oficialmente.

Sin embargo, x64 y Win32 están relacionados con la plataforma de hardware en la que se ejecuta el programa.Sabemos que hay dos tipos de CPU de computadora: 32 bits y 64 bits, y los sistemas operativos correspondientes también tienen sistemas operativos de 32 bits y Sistemas operativos de 64 bits. Win32 corresponde a un sistema operativo de 32 bits y x64 corresponde a un sistema operativo de 64 bits. En términos generales, un sistema operativo de 32 bits solo puede ejecutar programas Win32, y un sistema operativo de 64 bits puede ejecutar tanto programas x64 como programas Win32. Para los usuarios, usar un sistema operativo de 64 bits es más compatible. Para los desarrolladores de programas, hay más máquinas que son compatibles con los programas Win32.

(2) La unidad del modo de tiempo de ejecución

El tamaño del archivo compilado por MT de subprocesos múltiples es mayor que el compilado por MD de subprocesos múltiples, porque MT coloca la biblioteca de tiempo de ejecución correspondiente directamente en el archivo PE compilado, mientras que MD lo obtiene de un dll de terceros cuando ejecuta la biblioteca de tiempo de ejecución en sí. no esta incluido. Los archivos compilados por MT de subprocesos múltiples no necesitan cargar archivos DLL de terceros cuando se ejecutan, por lo que la eficiencia de ejecución es ligeramente superior a la de MD de subprocesos múltiples. Por supuesto, como usuario, no puede sentirlo en absoluto. .

En la actualidad, la mayoría del software en el mercado utiliza el método MD de subprocesos múltiples, el archivo compilado es pequeño, todas las bibliotecas de tiempo de ejecución están unificadas y la administración de la memoria también se simplifica, eliminando varios errores causados ​​​​por el acceso a la memoria entre módulos. En la actualidad, la mayoría del software en el mercado utiliza el método MD de subprocesos múltiples, el archivo compilado es pequeño, todas las bibliotecas de tiempo de ejecución están unificadas y la administración de la memoria también se simplifica, eliminando varios errores causados ​​​​por el acceso a la memoria entre módulos.

Seleccione las propiedades de configuración en la ventana de propiedades del proyecto, la DLL de depuración multiproceso de generación de código (/MDd) y la DLL de depuración multiproceso (/MTd) de la opción C++ son la versión de depuración, y las que no tienen d detrás son la versión de lanzamiento. El MT multiproceso carga la biblioteca de tiempo de ejecución estática, que pertenece a la versión de lenguaje C. La versión MD de subprocesos múltiples carga una biblioteca de tiempo de ejecución dinámica, que pertenece a la versión de Microsoft. Independientemente del modo de tiempo de ejecución que elija, el modo de su proyecto y sus proyectos de biblioteca dependientes deben estar unificados. Por ejemplo, si el modo de su proyecto helloworld es MD, entonces los modos de sus bibliotecas dependientes ceres y libglog_static también deben ser MD. No hay un caso especial, solo use el modo predeterminado MD de manera uniforme.

(3) Biblioteca dinámica y biblioteca estática

Para las bibliotecas estáticas, las funciones y los datos se compilan en un archivo binario (generalmente con una extensión .lib). En el caso de las bibliotecas estáticas, cuando se compila y vincula el ejecutable, el vinculador copia estas funciones y datos de la biblioteca y los combina con otros módulos de la aplicación para crear el ejecutable final (archivo .exe). Al distribuir un producto, solo se debe distribuir el ejecutable, no las bibliotecas estáticas que se utilizan.

Cuando se utiliza una biblioteca dinámica, a menudo se proporcionan dos archivos después de la compilación: un archivo de biblioteca de importación (. lib) (también llamado "archivo de biblioteca de importación") y un archivo DLL (. dll). Por supuesto, le diré más adelante que si solo se proporciona un archivo DLL, también se puede llamar usando el método de conexión de pantalla, pero es un poco problemático. Aunque el nombre del sufijo de la biblioteca importada también es "lib", existe una diferencia esencial entre el archivo de biblioteca importado de la biblioteca dinámica y el archivo de biblioteca estática. Para un archivo DLL, su archivo de biblioteca de importación (.lib) contiene los nombres simbólicos de las funciones y variables exportadas por la DLL, y el archivo .dll contiene las funciones y los datos reales de la DLL. En el caso de utilizar una biblioteca dinámica, al compilar y vincular un archivo ejecutable, solo se debe vincular el archivo de biblioteca de importación de la DLL, y el código de función y los datos de la DLL no se pueden copiar en el archivo ejecutable hasta que el programa ejecutable se está ejecutando Para cargar la DLL requerida, asigne esa DLL al espacio de direcciones del proceso y luego acceda a las funciones exportadas en la DLL. En este momento, al liberar el producto, además de liberar el archivo ejecutable, también es necesario liberar la biblioteca de vínculos dinámicos para que el programa la llame.

Tanto la biblioteca de enlaces estáticos como la biblioteca de enlaces dinámicos comparten código. Si se utiliza la biblioteca de enlaces estáticos, todas las instrucciones de la biblioteca estática lib se incluyen directamente en el archivo exe generado final. Sin embargo, si se utiliza una biblioteca dinámica DLL, la DLL no tiene que incluirse en el archivo ejecutable final, y el archivo DLL independiente del ejecutable puede referenciarse y desinstalarse "dinámicamente" cuando se ejecuta el archivo ejecutable. Otra diferencia entre una biblioteca de enlaces estáticos y una biblioteca de enlaces dinámicos es que la biblioteca de enlaces estáticos no puede contener otras bibliotecas de enlaces dinámicos o bibliotecas estáticas, y la biblioteca de enlaces dinámicos también puede contener otras bibliotecas de enlaces dinámicos o estáticos.

Los proyectos de rutina anteriores helloworld y helloworld_static se utilizan para ilustrar el proceso de vinculación de la biblioteca dinámica y la biblioteca estática.Primero, la biblioteca estática libglog_static.lib está vinculada estáticamente a la biblioteca estática ceres_static.lib y la biblioteca dinámica ceres.dll respectivamente. Es decir, tanto ceres_static.lib como ceres.dll han incluido todo el contenido de libglog_static.lib, y libglog_static.lib ya no es necesario cuando se liberan las bibliotecas ceres_static.lib y ceres.dll. La biblioteca estática ceres_static.lib está vinculada estáticamente al programa de aplicación helloworld_static.exe, lo que significa que helloworld_static.exe ya ha incluido todo el contenido de ceres_static.lib Solo necesitamos copiar helloworld_static.exe al cliente al liberar el programa. . La biblioteca dinámica ceres.dll está vinculada dinámicamente al programa de aplicación helloworld.exe, es decir, cuando helloworld.exe se esté ejecutando, se vinculará dinámicamente a ceres.dll, por lo que cuando liberemos el programa, debemos vincular helloworld. exe y ceres.dll juntos Cópielo en el cliente. Si solo copia helloworld.exe al cliente, el programa informará un error de que ceres.dll no se puede encontrar cuando el programa se está ejecutando.

(4) Soporte de tiempo de ejecución a nivel del sistema

En la situación discutida anteriormente, la biblioteca estática lib, la biblioteca dinámica dll y el programa de aplicación exe en realidad dependen del soporte de tiempo de ejecución a nivel del sistema (RunTime). Para cualquier programa de C++ que se ejecute en un sistema Windows, depende de la biblioteca de tiempo de ejecución de C++ del sistema (Microsoft Virtual C++). Y para cualquier programa basado en .NET (como WPF, Winform, etc.) que se ejecute en el sistema Windows, debe depender de la biblioteca de tiempo de ejecución .NET del sistema (.NET Framework).

Debido a que los programas que discutimos anteriormente son todos programas de C++, aquí discutimos principalmente la biblioteca de tiempo de ejecución de C++ del sistema Windows. Lo probé personalmente, ya sea win7 o win10, después de que el sistema esté instalado o el sistema se actualice automáticamente, la biblioteca de tiempo de ejecución de C++ (Microsoft Virtual C++) se instalará automáticamente, como se muestra a continuación.

En primer lugar, debemos saber que existen muchas versiones de Virtual C++, y la versión superior no es necesariamente compatible con versiones anteriores (por ejemplo, si un programa depende de Virtual C++ 2010, es posible que su computadora no pueda ejecutarse si solo Virtual C++ C++ 2012 está instalado). Por lo tanto, todas las versiones compatibles actualmente de Virtual C++ generalmente están instaladas en la computadora, incluidas 2005/2008/2010/2012/2013/2015-2022, y la versión 2015-2022 incluye 2015 y versiones posteriores. Además, la versión Virtual C++ se divide en 32 bits (x86) y (x64), en el sistema Windows de 64 bits se instalarán tanto la versión x86 como x64 de Virtual C++, mientras que en el sistema Windows de 32 bits , solo se instalará la versión x86 de Virtual C++.

En algunos casos especiales, es posible que algunas computadoras no tengan instalado Virtual C++ o que la versión de Virtual C++ no esté completa. Luego, el programa que enviamos al cliente (como helloworld_static.exe o helloworld.exe+ceres.dll) puede informar un error que indica que falta MSVCP140.dll, como:

La solución más directa es descargar la versión correspondiente de Virtual C++ e instalarla en su computadora. Generalmente, qué versión del entorno de desarrollo de Virtual Studio usamos para desarrollar este programa C++, entonces este programa C++ se basa en Virtual C++ integrado por esta versión de Virtual Studio. Puede ir a la página de propiedades del proyecto para ver la versión específica del conjunto de herramientas de la plataforma. Los números de versión del conjunto de herramientas correspondientes a cada versión de Virtual Studio son los siguientes:

-Visual Studio 2022: V143

-Visual Studio 2019: V142

-Visual Studio 2017: V141

-Visual Studio 2015: V140

-Visual Studio 2013: V120

-Visual Studio 2012: V110

-Visual Studio 2010: V100

-Visual Studio 2008: V90

-Visual Studio 2005: V80

-Visual Studio 2003: V71

-Visual Studio 2002: V70

-Visual Studio 6: V60

 Si no sabe qué versión de Virtual C++ falta, simplemente instale todas las versiones de Virtual C++. El paquete de instalación de Virtual C++ se puede descargar desde el sitio web oficial de Microsoft ( Descargas redistribuibles de Visual C++ compatibles más recientes | Microsoft Learn ). El paquete de instalación es un archivo ejecutable VC_redist. Después de ejecutarse, la versión correspondiente de Virtual C++ se instalará en línea. Si le resulta problemático descargar manualmente cada versión de Virtual C++ una por una, puede ir aquí ( Descargar Microsoft Visual C++ Redistributable (Todas las versiones) ) para empaquetar y descargar todas las versiones de Virtual C++.

Pero para los usuarios normales que no entienden de tecnología, la instalación manual de Virtual C++ es demasiado complicada y, a veces, nuestros programas C++ pueden depender de bibliotecas adicionales como MFC o ATL, porque no es realista que los usuarios instalen manualmente estas dependencias. De hecho, cuando compilamos nuestro proyecto, podemos establecer "Copiar el tiempo de ejecución de C++ en el directorio de salida" en la página de propiedades en "Sí".

  Luego, después de compilar el proyecto, además de generar archivos exe y dll escritos por nosotros mismos, también se genera una gran cantidad de archivos dll a nivel del sistema en el directorio de salida de la compilación. Solo necesitamos copiar todos estos dlls de nivel de sistema y nuestros propios archivos exe y dll al cliente, y la computadora del lado del cliente puede usar el programa normalmente sin importar si el entorno de tiempo de ejecución de nivel de sistema está instalado o no.

 3. Instale la biblioteca Ceres con CMake

Si no usa el entorno de desarrollo de Virtual Studio para el desarrollo, debe usar CMake para configurar y compilar manualmente Ceres y su código fuente dependiente paso a paso. Los pasos específicos son relativamente engorrosos, vayamos directamente al tutorial oficial de Ceres:

Instalación — Ceres Solver

referencias

[1] Zhang Hu, Robot SLAM Navigation Core Technology and Practice [M], Machinery Industry Press, 2022.

Supongo que te gusta

Origin blog.csdn.net/m0_68732180/article/details/130233901
Recomendado
Clasificación