Opciones adicionales para integradores
En el caso de que estés construyendo la librería BSON C++ y/o el driver C++ para integrarlo con otros componentes y desees evitar la posibilidad de colisión con componentes instalados desde una compilación estándar o desde un administrador de paquetes de distribución, puedes hacer uso del BSONCXX_OUTPUT_BASENAME y MONGOCXX_OUTPUT_BASENAME opciones para cmake.
cmake .. \ -DBSONCXX_OUTPUT_BASENAME=custom_bsoncxx \ -DMONGOCXX_OUTPUT_BASENAME=custom_mongocxx
El comando anterior produciría librerías denominadas libcustom_bsoncxx.so y libcustom_mongocxx.so (o con la extensión adecuada para la plataforma de compilación). Esas bibliotecas podrían colocarse en un directorio estándar del sistema o en una ubicación alternativa y podrían vincularse especificando algo como -lcustom_mongocxx -lcustom_bsoncxx en la línea de comandos del enlazador (posiblemente ajustando los flags específicos a los requeridos por tu enlazador).
Instala con gestores de paquetes
Puedes usar los siguientes gestores de paquetes para instalar el controlador C++:
Instrucciones para la instalación de Vcpkg
Si aún no tienes Vcpkg instalado, instálalo con el siguiente comando:
$ git clone https://github.com/Microsoft/vcpkg.git $ cd vcpkg $ ./bootstrap-vcpkg.sh
Opcionalmente, para instalar con la integración de Visual Studio:
vcpkg integrate install
Instala el driver. Es posible que necesites git pull para obtener la versión más reciente del driver.
$ ./vcpkg install mongo-cxx-driver
Puede usar el archivo toolchain, vcpkg.cmake, para indicarle a CMake dónde encontrar los archivos de desarrollo, por ejemplo:
-DCMAKE_TOOLCHAIN_FILE=/<path to vcpkg repo>/vcpkg/scripts/buildsystems/vcpkg.cmake
Puede encontrar los archivos de encabezado en:
vcpkg/installed/<CPU ARCHITECTURE>-<OPERATING SYSTEM>/include/
Los archivos de la biblioteca están en:
vcpkg/installed/<CPU ARCHITECTURE>-<OPERATING SYSTEM>/lib/
Instrucciones de instalación de Conan
Especificador de paquete: mongo-cxx-driver/3.8.0
Si aún no tiene instalado Conan, instálelo y ejecute el siguiente comando de inicialización de Conan:
$ pip install conan $ conan profile detect --force
Agrega lo siguiente a tu conanfile.txt:
[requires] mongo-cxx-driver/3.8.0 [generators] CMakeDeps CMakeToolchain
Instala el driver a través de Conan y compila tu proyecto:
$ conan install conanfile.txt --output-folder=build --build=missing $ cmake \ -B build \ -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake \ -DCMAKE_BUILD_TYPE=Release $ cmake --build build
Instrucciones de instalación de Homebrew
Los usuarios de MacOS pueden utilizar Homebrew para instalar el driver C++ ejecutando el siguiente comando:
brew install mongo-cxx-driver
Para una Mac Apple Silicon
Los encabezados se pueden encontrar en:
/opt/homebrew/include/mongocxx/v_noabi/ /opt/homebrew/include/bsoncxx/v_noabi/
Puedes encontrar los archivos de la librería en:
/opt/homebrew/lib/
Para una Mac con procesador Intel
Los encabezados se pueden encontrar en:
/usr/local/include/mongocxx/v_noabi/ /usr/local/include/bsoncxx/v_noabi/
Puedes encontrar los archivos de la librería en:
/usr/local/lib/
Instale el controlador MongoDB C
El controlador mongocxx se construye sobre el controlador C de MongoDB.
La compilación de mongocxx-4.2.0 descarga e instala automáticamente el driver C si este no se detecta. Para utilizar una instalación existente del controlador C, establezca CMAKE_PREFIX_PATH en el directorio que contiene la instalación del controlador C. Para información sobre la versión mínima libmongoc requerida para cada versión del controlador C++, consulta Compatibilidad.
A menos que sepa que su gestor de paquetes ofrece una versión suficientemente reciente, deberá descargar y compilar el código fuente. Obtén un tarball de la página versión de driver C.
Sigue las instrucciones para compilar desde un tarball en Instalando libmongoc.
Las mejores prácticas de la industria y algunas normativas exigen el uso de TLS 1.1 o superior. El controlador C de MongoDB admite TLS 1.1 en Linux si OpenSSL es al menos la versión 1.0.1. En macOS y Windows, el controlador C utiliza implementaciones nativas de TLS compatibles con TLS 1.1.
Configuración avanzada (Configuraciones estáticas)
Las siguientes subsecciones detallan las opciones avanzadas para configurar el driver de C++ y/o sus dependencias como librerías estáticas en lugar de las librerías compartidas típicas. Estas opciones producirán artefactos de librería que se comportarán de manera diferente. Asegúrese de tener un conocimiento completo de las implicaciones de los distintos enfoques de vinculación antes de utilizar estas opciones.
Configurando con mongocxx 3.2.x o una versión más reciente
Los usuarios tienen la opción de compilar mongocxx como una librería estática. No se recomienda para usuarios novatos. Un usuario puede habilitar este comportamiento con la opción -DBUILD_SHARED_LIBS:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF
Configuración con mongocxx 3.5.0 o posterior
Los usuarios tienen la opción de compilar mongocxx tanto como bibliotecas estáticas como compartidas. Un usuario puede habilitar este comportamiento con la opción -DBUILD_SHARED_AND_STATIC_LIBS:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_AND_STATIC_LIBS=ON
Los usuarios pueden crear mongocxx como una biblioteca compartida que tiene un enlace estático libmongoc a. Esto no se recomienda para usuarios principiantes. Se puede habilitar este comportamiento con la -DBUILD_SHARED_LIBS_WITH_STATIC_MONGOC opción:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS_WITH_STATIC_MONGOC=ON
Deshabilitando pruebas
Pase -DENABLE_TESTS=OFF como una opción de cmake para desactivar la configuración de objetivos de prueba.
cmake .. -DENABLE_TESTS=OFF cmake --build .. --target help # No test targets are configured.
Instalación en directorios no estándar
Para instalar el driver de C++ en un directorio no estándar, especifique CMAKE_INSTALL_PREFIX a la ruta de instalación deseada:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver
También considere especificar la opción -DCMAKE_INSTALL_RPATH= en el directorio lib de la instalación. Esto puede permitir que libmongocxx.so localice libbsoncxx.so:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver \ -DCMAKE_INSTALL_RPATH=$HOME/mongo-cxx-driver/lib
Si el controlador C se instala en un directorio no estándar, especifique CMAKE_PREFIX_PATH en la ruta de instalación del controlador C:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_PREFIX_PATH=$HOME/mongo-c-driver \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver
Nota
Si necesita varias rutas en una variable PATH de CMake, sepárelas con un punto y coma de la siguiente manera: -DCMAKE_PREFIX_PATH="/your/cdriver/prefix;/some/other/path"
Configuración mongocxx 3.1 con.x 3.0 o.x
En lugar de la opción -DCMAKE_PREFIX_PATH, los usuarios deben especificar el directorio de instalación de libmongoc utilizando las opciones -DLIBMONGOC_DIR y -DLIBBSON_DIR:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DLIBMONGOC_DIR=$HOME/mongo-c-driver \ -DLIBBSON_DIR=$HOME/mongo-c-driver \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver
Solución de problemas
Solucionar el error Library not loaded en macOS
Las aplicaciones que se enlazan a una instalación en un directorio no estándar pueden encontrar un error al cargar el controlador de C++ en tiempo de ejecución. ejemplo:
# Tell pkg-config where to find C++ driver installation. export PKG_CONFIG_PATH=$HOME/mongo-cxx-driver/lib/pkgconfig clang++ app.cpp -std=c++11 $(pkg-config --cflags --libs libmongocxx) -o ./app.out ./app.out # Prints the following error: # dyld[3217]: Library not loaded: '@rpath/libmongocxx._noabi.dylib' # Referenced from: '/Users/kevin.albertson/code/app.out' # Reason: tried: '/usr/local/lib/libmongocxx._noabi.dylib' (no such file), '/usr/lib/libmongocxx._noabi.dylib' (no such file) # zsh: abort ./app.out
El install name por defecto del controlador C++ en macOS incluye @rpath:
otool -D $HOME/mongo-cxx-driver/lib/libmongocxx.dylib # Prints: # /Users/kevin.albertson/mongo-cxx-driver/lib/libmongocxx.dylib: # @rpath/libmongocxx._noabi.dylib
Incluir @rpath en el nombre de instalación permite que las aplicaciones de enlace controlen la lista de rutas de búsqueda para la librería.
app.out incluye el comando de carga para @rpath/libmongocxx._noabi.dylib. app.out no tiene entradas para sustituir por @rpath.
Hay varias formas de considerar la resolución de esto en macOS:
Pasa DYLD_FALLBACK_LIBRARY_PATH al directorio que contiene las librerías del driver C++:
DYLD_FALLBACK_LIBRARY_PATH=$HOME/mongo-cxx-driver/lib ./app.out # Prints "successfully connected with C++ driver"
Alternativamente, se puede pasar la opción del enlazador -Wl,-rpath para agregar entradas que sustituyan a @rpath:
# Tell pkg-config where to find C++ driver installation. export PKG_CONFIG_PATH=$HOME/mongo-cxx-driver/lib/pkgconfig # Pass the linker option -rpath to set an rpath in the final executable. clang++ app.cpp -std=c++11 -Wl,-rpath,$HOME/mongo-cxx-driver/lib $(pkg-config --cflags --libs libmongocxx) -o ./app.out ./app.out # Prints "successfully connected with C++ driver"
Si se compila la aplicación con cmake, la configuración por defecto de RPATH incluye la RPATH completa a todas las librerías usadas en el árbol de compilación. Sin embargo, al instalar, cmake vaciará la RPATH de estos objetivos para que se instalen con una RPATH vacía. Esto puede provocar un error Library not loaded después de la instalación.
Ejemplo:
# Build application ``app`` using the C++ driver from a non-standard install. cmake \ -DCMAKE_PREFIX_PATH=$HOME/mongo-cxx-driver \ -DCMAKE_INSTALL_PREFIX=$HOME/app \ -DCMAKE_CXX_STANDARD=11 \ -Bcmake-build -S. cmake --build cmake-build --target app.out # Running app.out from build tree includes rpath to C++ driver. ./cmake-build ./cmake-build/app.out # Prints: "successfully connected with C++ driver" cmake --build cmake-build --target install # Running app.out from install tree does not include rpath to C++ driver. $HOME/app/bin/app.out # Prints "Library not loaded" error.
Considere configurar -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE para que el rpath del ejecutable se mantenga en el destino de instalación.
# Build application ``app`` using the C++ driver from a non-standard install. # Use CMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE to keep rpath entry on installed app. cmake \ -DCMAKE_PREFIX_PATH=$HOME/mongo-cxx-driver \ -DCMAKE_INSTALL_PREFIX=$HOME/app \ -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE \ -DCMAKE_CXX_STANDARD=11 \ -Bcmake-build -S. cmake --build cmake-build --target install $HOME/app/bin/app.out # Prints "successfully connected with C++ driver"
Consulte la documentación de cmake para el manejo de RPATH para obtener más información.
Cómo solucionar el error "No se puede abrir el archivo de objeto compartido" en Linux
Las aplicaciones que se enlazan a una instalación en un directorio no estándar pueden encontrar un error al cargar el controlador de C++ en tiempo de ejecución. ejemplo:
# Tell pkg-config where to find C++ driver installation. export PKG_CONFIG_PATH=$HOME/mongo-cxx-driver/lib/pkgconfig g++ -std=c++11 app.cpp $(pkg-config --cflags --libs libmongocxx) -o ./app.out ./app.out # Prints the following error: # ./app.out: error while loading shared libraries: libmongocxx.so._noabi: cannot open shared object file: No such file or directory
Hay varias formas de considerar resolver esto en Linux:
Pasa LD_LIBRARY_PATH al directorio que contiene las librerías del driver C++:
LD_LIBRARY_PATH=$HOME/mongo-cxx-driver/lib ./app.out # Prints "successfully connected with C++ driver"
Como alternativa, se puede pasar la opción del enlazador -Wl,-rpath para agregar entradas rpath:
# Tell pkg-config where to find C++ driver installation. export PKG_CONFIG_PATH=$HOME/mongo-cxx-driver/lib/pkgconfig # Pass the linker option -rpath to set an rpath in the final executable. g++ app.cpp -std=c++11 -Wl,-rpath,$HOME/mongo-cxx-driver/lib $(pkg-config --cflags --libs libmongocxx) -o ./app.out ./app.out # Prints "successfully connected with C++ driver"
Si se compila la aplicación con cmake, la configuración por defecto de RPATH incluye la RPATH completa a todas las librerías usadas en el árbol de compilación. Sin embargo, al instalar, cmake vaciará la RPATH de estos objetivos para que se instalen con una RPATH vacía. Esto puede provocar un error Library not loaded después de la instalación.
Ejemplo:
# Build application ``app`` using the C++ driver from a non-standard install. cmake \ -DCMAKE_PREFIX_PATH=$HOME/mongo-cxx-driver \ -DCMAKE_INSTALL_PREFIX=$HOME/app \ -DCMAKE_CXX_STANDARD=11 \ -Bcmake-build -S. cmake --build cmake-build --target app.out # Running app.out from build tree includes rpath to C++ driver. ./cmake-build ./cmake-build/app.out # Prints: "successfully connected with C++ driver" cmake --build cmake-build --target install # Running app.out from install tree does not include rpath to C++ driver. $HOME/app/bin/app.out # Prints "cannot open shared object file" error.
Considere configurar -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE para que el rpath del ejecutable se mantenga en el destino de instalación.
# Build application ``app`` using the C++ driver from a non-standard install. # Use CMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE to keep rpath entry on installed app. cmake \ -DCMAKE_PREFIX_PATH=$HOME/mongo-cxx-driver \ -DCMAKE_INSTALL_PREFIX=$HOME/app \ -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE \ -DCMAKE_CXX_STANDARD=11 \ -Bcmake-build -S. cmake --build cmake-build --target install $HOME/app/bin/app.out # Prints "successfully connected with C++ driver"
Consulte la documentación de cmake para el manejo de RPATH para obtener más información.