高级配置和安装选项
在此页面上
为集成商提供的其他选项
如果您正在构建 BSON C++ 库和/或 C++ 驱动程序以嵌入其他组件,并且希望避免与通过标准构建或发行版包管理器安装的组件发生潜在冲突,则可以使用将 BSONCXX_OUTPUT_BASENAME
和MONGOCXX_OUTPUT_BASENAME
选项设置为cmake
。
cmake .. \ -DBSONCXX_OUTPUT_BASENAME=custom_bsoncxx \ -DMONGOCXX_OUTPUT_BASENAME=custom_mongocxx
上述命令将生成名为libcustom_bsoncxx.so
和libcustom_mongocxx.so
的库(或具有适合构建平台的扩展名)。 这些库可以放置在标准系统目录或备用位置,并且可以通过在链接器命令行上指定类似-lcustom_mongocxx -lcustom_bsoncxx
的内容来链接(可能会将特定标志调整为链接器所需的标志)。
使用包管理器安装
您可以使用以下包管理器来安装C++驾驶员:
Vcpkg 安装说明
如果您尚未安装 Vcpkg,请使用以下命令进行安装:
$ git clone https://github.com/Microsoft/vcpkg.git $ cd vcpkg $ ./bootstrap-vcpkg.sh
(可选)与 Visual Studio 集成一起安装:
vcpkg integrate install
安装驱动程序。 您可能需要git pull
获取最新版本的驱动程序。
$ ./vcpkg install mongo-cxx-driver
您可以使用工具链文件vcpkg.cmake
来指示 CMake 到哪里查找开发文件,例如:
-DCMAKE_TOOLCHAIN_FILE=/<path to vcpkg repo>/vcpkg/scripts/buildsystems/vcpkg.cmake
您可以在以下位置找到头文件:
vcpkg/installed/<CPU ARCHITECTURE>-<OPERATING SYSTEM>/include/
库文件位于:
vcpkg/installed/<CPU ARCHITECTURE>-<OPERATING SYSTEM>/lib/
Conan 安装说明
包说明符: mongo-cxx-driver/3.8.0
如果您尚未安装 Conan,请安装它并运行以下 Conan 初始化命令:
$ pip install conan $ conan profile detect --force
将以下内容添加到您的conanfile.txt
中:
[requires] mongo-cxx-driver/3.8.0 [generators] CMakeDeps CMakeToolchain
通过 Conan 安装驾驶员,并构建您的项目:
$ 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
Homebrew 安装说明
MacOS 用户可以通过运行以下命令,使用 Homebrew 安装C++驾驶员:
brew install mongo-cxx-driver
对于 Apple Silicon Mac
标头位于:
/opt/homebrew/include/mongocxx/v_noabi/ /opt/homebrew/include/bsoncxx/v_noabi/
库文件位于:
/opt/homebrew/lib/
对于 Intel Mac
标头位于:
/usr/local/include/mongocxx/v_noabi/ /usr/local/include/bsoncxx/v_noabi/
库文件位于:
/usr/local/lib/
安装MongoDB C驱动程序
mongocxx驾驶员构建在MongoDB C驾驶员程序之上。
如果未检测到C驾驶员程序, 构建 版本会自动下载并安装C驾驶员程序。要使用现有安装的C驾驶员,请将3.9.0CMAKE_PREFIX_PATH
libmongoc
设立为包含C驾驶员安装的目录。有关每个版本的C++驾驶员所需的最低 版本的信息,请参阅 libmongoc 兼容性。
除非您知道您的包管理器提供了足够新的版本,否则您将需要从源代码下载并构建。 从C驱动程序发布 页面获取 tarball。
按照 安装 libmongoc 从 tarball 进行构建的说明进行操作。
行业最佳实践和某些法规要求使用 TLS 1.1或更高版本。 1.1如果 OpenSSL 的版本至少为1.0.1 ,则 MongoDB C 驱动程序支持 Linux 上的 TLS 。在 macOS 和 Windows 上,C 驱动程序使用支持 TLS 1.1的原生 TLS 实现。
高级配置(静态配置)
以下小节详细介绍了用于将C++驾驶员和/或其依赖项配置为静态库而不是典型共享库的高级选项。 这些选项将生成行为不同的库工件。 在使用这些选项之前,请确保您完全了解各种链接方法的含义。
使用mongocxx
3.2 .x 或更高版本进行配置
用户可以选择将mongocxx
构建为静态库。 不建议新用户这样做。 用户可以使用-DBUILD_SHARED_LIBS
选项启用此行为:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF
使用mongocxx
3.5.0 或更新版本进行配置
用户可以选择将mongocxx
构建为静态库和共享库。 用户可以使用-DBUILD_SHARED_AND_STATIC_LIBS
选项启用此行为:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_AND_STATIC_LIBS=ON
用户可以选择将mongocxx
构建为已静态链接libmongoc
的共享库。 不建议新用户这样做。 用户可以使用-DBUILD_SHARED_LIBS_WITH_STATIC_MONGOC
选项启用此行为:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS_WITH_STATIC_MONGOC=ON
禁用测试
将-DENABLE_TESTS=OFF
作为 cmake 选项传递,以禁用测试目标配置。
cmake .. -DENABLE_TESTS=OFF cmake --build .. --target help # No test targets are configured.
安装到非标准目录
要将 C++ 驱动程序安装到非标准目录,请将CMAKE_INSTALL_PREFIX
指定为所需的安装路径:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver
还可以考虑为安装的lib
目录指定-DCMAKE_INSTALL_RPATH=
选项。 这可能会使 libmongocxx.so 找到 libbsoncxx.so:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver \ -DCMAKE_INSTALL_RPATH=$HOME/mongo-cxx-driver/lib
如果 C 驱动程序安装在非标准目录下,请将CMAKE_PREFIX_PATH
指定为 C 驱动程序的安装路径:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_PREFIX_PATH=$HOME/mongo-c-driver \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver
注意
如果您需要在 CMake PATH 变量中包含多个路径,请用分号将它们分隔开来,如下所示: -DCMAKE_PREFIX_PATH="/your/cdriver/prefix;/some/other/path"
mongocxx
3.1使用.x3.0 或.x 进行配置
用户必须使用-DLIBMONGOC_DIR
和-DLIBBSON_DIR
选项指定libmongoc
安装目录,而不是-DCMAKE_PREFIX_PATH
选项:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DLIBMONGOC_DIR=$HOME/mongo-c-driver \ -DLIBBSON_DIR=$HOME/mongo-c-driver \ -DCMAKE_INSTALL_PREFIX=$HOME/mongo-cxx-driver
故障排除
修复Library not loaded
macOS 上的 错误
链接到非标准目录安装的应用程序可能会在运行时加载 C++ 驱动程序时遇到错误。 示例:
# 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
macOS 上 C++ 驱动程序的默认install name
包括@rpath
:
otool -D $HOME/mongo-cxx-driver/lib/libmongocxx.dylib # Prints: # /Users/kevin.albertson/mongo-cxx-driver/lib/libmongocxx.dylib: # @rpath/libmongocxx._noabi.dylib
在安装名称中包含@rpath
可以允许链接应用程序来控制库的搜索路径列表。
app.out
包括@rpath/libmongocxx._noabi.dylib
的加载命令。 app.out
没有可以替代@rpath
的条目。
有几种方法可以考虑在 macOS 上解决此问题:
将DYLD_FALLBACK_LIBRARY_PATH
传递到包含 C++ 驱动程序库的目录:
DYLD_FALLBACK_LIBRARY_PATH=$HOME/mongo-cxx-driver/lib ./app.out # Prints "successfully connected with C++ driver"
或者,可以传递链接器选项-Wl,-rpath
来添加条目以替换@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"
如果使用 cmake 构建应用程序,则 默认 RPATH 设置 在构建树中包含所有使用的库的完整 RPATH。但是,在安装时,cmake 会清除这些目标的 RPATH,因此在安装它们时会使用空的 RPATH。 这可能会导致安装后出现Library not loaded
错误。
示例:
# 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.
请考虑设置-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE
,以便将可执行文件的 rpath 保留在安装目标中。
# 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"
有关 RPATH 处理 ,请参阅 cmake 文档 以了解更多信息。
修复Linux上的“无法打开共享对象文件”错误
链接到非标准目录安装的应用程序可能会在运行时加载 C++ 驱动程序时遇到错误。 示例:
# 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
有几种方法可以考虑在Linux上解决这个问题:
将LD_LIBRARY_PATH
传递到包含 C++ 驱动程序库的目录:
LD_LIBRARY_PATH=$HOME/mongo-cxx-driver/lib ./app.out # Prints "successfully connected with C++ driver"
或者,可以传递链接器选项-Wl,-rpath
以添加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"
如果使用 cmake 构建应用程序,则 默认 RPATH 设置 在构建树中包含所有使用的库的完整 RPATH。但是,在安装时,cmake 会清除这些目标的 RPATH,因此在安装它们时会使用空的 RPATH。 这可能会导致安装后出现Library not loaded
错误。
示例:
# 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.
请考虑设置-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE
,以便将可执行文件的 rpath 保留在安装目标中。
# 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"
有关 RPATH 处理 ,请参阅 cmake 文档 以了解更多信息。