Opções avançadas de configuração e instalação
Nesta página
- Opções adicionais para integradores
- Instalando o driver MongoDB C
- Configuração avançada (configurações estáticas)
- Configurando com
mongocxx
3.2.x ou mais recente - Configurando com
mongocxx
3.5.0 ou mais recente - Desabilitando testes
- Instalando em diretórios não padrão
- Configurando com
mongocxx
3.1.x ou 3.0.x - Corrigindo o erro
Library not loaded
no macOS - Corrigindo o erro "não é possível abrir o arquivo de objeto compartilhado" no Linux
Opções adicionais para integradores
Caso você esteja construindo a biblioteca BSON C++ e/ou o driver C++ para incorporar com outros componentes e deseja evitar o potencial de colisão com componentes instalados a partir de uma compilação padrão ou de um gerenciador de pacotes de distribuição, você pode usar as opções BSONCXX_OUTPUT_BASENAME
e MONGOCXX_OUTPUT_BASENAME
para cmake
.
cmake .. \ -DBSONCXX_OUTPUT_BASENAME=custom_bsoncxx \ -DMONGOCXX_OUTPUT_BASENAME=custom_mongocxx
O comando acima produziria bibliotecas denominadas libcustom_bsoncxx.so
e libcustom_mongocxx.so
(ou com a extensão apropriada para a plataforma de construção). Essas bibliotecas podem ser colocadas em um diretório do sistema padrão ou em um local alternativo e podem ser vinculadas especificando algo como -lcustom_mongocxx -lcustom_bsoncxx
na linha de comando do vinculador (possivelmente ajustando os sinalizadores específicos aos exigidos pelo vinculador).
Instalando o driver MongoDB C
O driver mongocxx se baseia no driver MongoDB C.
A compilação de mongocxx-3.9.0 baixa e instala automaticamente o driver C se o driver C não for detectado. Para usar uma instalação existente do driver C, defina CMAKE_PREFIX_PATH
como o diretório que contém a instalação do driver C.
Para mongocxx-3.10.x, libmongoc 1.25.0 ou posterior é necessário.
Para mongocxx-3.9.x, libmongoc 1.25.0 ou posterior é necessário.
Para mongocxx-3.8.x, libmongoc 1.24.0 ou posterior é necessário.
Para mongocxx-3.7.x, libmongoc 1.22.1 ou posterior é necessário.
Para mongocxx-3.6.x, libmongoc 1.17.0 ou posterior é necessário.
Para mongocxx-3.5.x, libmongoc 1.15.0 ou posterior é necessário.
Para mongocxx-3.4.x, libmongoc 1.13.0 ou posterior é necessário.
Para mongocxx-3.3.x, libmongoc 1.10.1 ou posterior é necessário.
Para mongocxx-3.2.x, libmongoc 1.9.2 ou posterior é necessário.
Para mongocxx-3.1.4+, libmongoc 1.7.0 ou posterior é necessário.
Para mongocxx-3.1.[0-3], libmongoc 1.5.0 ou posterior é necessário.
Para mongocxx-3.0.x, recomendamos o último 1.4.x versão do libmongoc
A menos que você saiba que seu gerenciador de pacote oferece uma versão suficientemente recente, você precisará baixar e construir a partir do código fonte. Obter um tarball da versão do Driver C página.
Siga as instruções para criar a partir de um tarball em Instalando a libmongoc.
As melhores práticas do setor e alguns regulamentos exigem o uso do TLS 1.1 ou mais recente. O MongoDB C Driver suporta TLS 1.1 no Linux se o OpenSSL tiver pelo menos a versão 1.0.1. No macOS e no Windows, o C Driver usa implementações de TLS nativas que suportam TLS 1.1.
Configuração avançada (configurações estáticas)
As subseções a seguir detalham opções avançadas para configurar o driver C++ e/ou suas dependências como bibliotecas estáticas em vez das bibliotecas compartilhadas típicas. Essas opções produzirão artefatos de biblioteca que se comportarão de forma diferente. Certifique-se de ter uma compreensão completa das implicações das várias abordagens de vinculação antes de utilizar essas opções.
Configurando com mongocxx
3.2.x ou mais recente
Os usuários têm a opção de construir o mongocxx
como uma biblioteca estática. Isso não é recomendado para usuários novatos. Um usuário pode habilitar este comportamento com a opção -DBUILD_SHARED_LIBS
:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF
Configurando com mongocxx
3.5.0 ou mais recente
Os usuários têm a opção de construir o mongocxx
como bibliotecas estáticas e compartilhadas. Um usuário pode habilitar este comportamento com a opção -DBUILD_SHARED_AND_STATIC_LIBS
:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_AND_STATIC_LIBS=ON
Os usuários têm a opção de construir o mongocxx
como uma biblioteca compartilhada que vinculou estaticamente ao libmongoc
. Isso não é recomendado para usuários novatos. Um usuário pode habilitar este comportamento com a opção -DBUILD_SHARED_LIBS_WITH_STATIC_MONGOC
:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS_WITH_STATIC_MONGOC=ON
Desabilitando testes
Passe o -DENABLE_TESTS=OFF
como uma opção cmake para desabilitar a configuração dos destinos de teste.
cmake .. -DENABLE_TESTS=OFF cmake --build .. --target help # No test targets are configured.
Instalando em diretórios não padrão
Para instalar o driver C++ em um diretório não padrão, especifique CMAKE_INSTALL_PREFIX
para o caminho de instalação desejado:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver
Considere também especificar a opção -DCMAKE_INSTALL_RPATH=
para o diretório lib
da instalação. Isto pode permitir que libmongocxx.so localize libbsoncxx.so:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver \ -DCMAKE_INSTALL_RPATH=$HOME/mongo-cxx-driver/lib
Se o driver C estiver instalado em um diretório não padrão, especifique CMAKE_PREFIX_PATH
para o caminho de instalação do driver C:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_PREFIX_PATH=$HOME/mongo-c-driver \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver
Observação
Se você precisar de vários caminhos em uma variável CMake PATH, separe-os com um ponto e vírgula como este: -DCMAKE_PREFIX_PATH="/your/cdriver/prefix;/some/other/path"
Configurando com mongocxx
3.1.x ou 3.0.x
Em vez da opção -DCMAKE_PREFIX_PATH
, os usuários devem especificar o diretório de instalação do libmongoc
usando as opções -DLIBMONGOC_DIR
e -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
Corrigindo o Library not loaded
erro no macOS
Os aplicativos vinculados a uma instalação de diretório não padrão podem encontrar um erro ao carregar o driver C++ no tempo de execução. Exemplo:
# 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
O install name
padrão do driver C++ no macOS inclui @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
no nome de instalação permite vincular aplicativos para controlar a lista de caminhos de pesquisa para a biblioteca.
app.out
inclui o comando de carregamento para @rpath/libmongocxx._noabi.dylib
. app.out
não tem entradas para substituir @rpath
.
Há várias maneiras de considerar resolver isso no macOS:
Passe DYLD_FALLBACK_LIBRARY_PATH
para o diretório que contém as bibliotecas de drivers C++:
DYLD_FALLBACK_LIBRARY_PATH=$HOME/mongo-cxx-driver/lib ./app.out # Prints "successfully connected with C++ driver"
Como alternativa, a opção de vinculador -Wl,-rpath
pode ser passada para adicionar entradas para substituir @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"
Se estiver criando o aplicação com cmake, as configurações padrão de RPATH inclua o RPATH completo para todas as bibliotecas usadas na árvore de construção. No entanto, ao instalar, o cmake limpará o RPATH desses alvos para que eles sejam instalados com um RPATH vazio. Isso pode resultar em um erro Library not loaded
após a instalação.
Exemplo:
# 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 o -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE
para que o rpath do executável seja mantido no destino da instalação.
# 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 a documentação do cmake para tratamento de RPATH para mais informações.
Corrigindo o erro "não é possível abrir o arquivo de objeto compartilhado" no Linux
Os aplicativos vinculados a uma instalação de diretório não padrão podem encontrar um erro ao carregar o driver C++ no tempo de execução. Exemplo:
# 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
Existem várias maneiras de considerar resolver isso no Linux:
Passe LD_LIBRARY_PATH
para o diretório que contém as bibliotecas de drivers C++:
LD_LIBRARY_PATH=$HOME/mongo-cxx-driver/lib ./app.out # Prints "successfully connected with C++ driver"
Como alternativa, a opção do vinculador -Wl,-rpath
pode ser passada para adicionar entradas do 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"
Se estiver criando o aplicação com cmake, as configurações padrão de RPATH inclua o RPATH completo para todas as bibliotecas usadas na árvore de construção. No entanto, ao instalar, o cmake limpará o RPATH desses alvos para que eles sejam instalados com um RPATH vazio. Isso pode resultar em um erro Library not loaded
após a instalação.
Exemplo:
# 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 o -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE
para que o rpath do executável seja mantido no destino da instalação.
# 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 a documentação do cmake para tratamento de RPATH para mais informações.