Docs 菜单
Docs 主页
/ / /
C++ 驱动程序
/

高级配置和安装选项

在此页面上

  • 为集成商提供的其他选项
  • 安装MongoDB C驱动程序
  • 高级配置(静态配置)
  • 使用 mongocxx 3.2 .x 或更高版本进行配置
  • 使用mongocxx 3.5.0或更新版本进行配置
  • 禁用测试
  • 安装到非标准目录
  • 使用mongocxx 3.1 .x 或3.0 .x 进行配置
  • 修复 macOS 上的Library not loaded错误
  • 修复 Linux 上的“无法打开共享对象文件”错误

如果您正在构建 BSON C++ 库和/或 C++ 驱动程序以嵌入其他组件,并且希望避免与通过标准构建或发行版包管理器安装的组件发生潜在冲突,则可以使用将 BSONCXX_OUTPUT_BASENAMEMONGOCXX_OUTPUT_BASENAME选项设置为cmake

cmake .. \
-DBSONCXX_OUTPUT_BASENAME=custom_bsoncxx \
-DMONGOCXX_OUTPUT_BASENAME=custom_mongocxx

上述命令将生成名为libcustom_bsoncxx.solibcustom_mongocxx.so的库(或具有适合构建平台的扩展名)。 这些库可以放置在标准系统目录或备用位置,并且可以通过在链接器命令行上指定类似-lcustom_mongocxx -lcustom_bsoncxx的内容来链接(可能会将特定标志调整为链接器所需的标志)。

mongocxx驾驶员构建在 MongoDB C驾驶员程序之上。

mongocxx- 3.9.0的版本 如果未检测到 C 驱动程序,则会自动下载并安装 C 驱动程序。 要使用现有安装的 C 驱动程序,请将CMAKE_PREFIX_PATH设置为包含 C 驱动程序安装的目录。

  • 对于 mongocxx- 3.10 .x、 需要 libmongoc 1.25.0或更高版本。

  • 对于 mongocxx- 3.9 .x、 需要 libmongoc 1.25.0或更高版本。

  • 对于 mongocxx- 3.8 .x、 需要 libmongoc 1.24.0或更高版本。

  • 对于 mongocxx- 3.7 .x、 需要 libmongoc 1.22.1或更高版本。

  • 对于 mongocxx- 3.6 .x、 需要 libmongoc 1.17.0或更高版本。

  • 对于 mongocxx- 3.5 .x、 需要 libmongoc 1.15.0或更高版本。

  • 对于 mongocxx- 3.4 .x、 需要 libmongoc 1.13.0或更高版本。

  • 对于 mongocxx- 3.3 .x、 需要 libmongoc 1.10.1或更高版本。

  • 对于 mongocxx- 3.2 .x、 需要 libmongoc 1.9.2或更高版本。

  • 对于 mongocxx- 3.1.4 +, 需要 libmongoc 1.7.0或更高版本。

  • 对于 mongocxx- 3.1 .[ 0 - 3 ], 需要 libmongoc 1.5.0或更高版本。

  • 对于 mongocxx- 3.0 .x、 我们建议使用最后一个1.4 .x 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构建为静态库。 不建议新用户这样做。 用户可以使用-DBUILD_SHARED_LIBS选项启用此行为:

cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=OFF

用户可以选择将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"

用户必须使用-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

链接到非标准目录安装的应用程序可能会在运行时加载 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 文档 以了解更多信息。

链接到非标准目录安装的应用程序可能会在运行时加载 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 文档 以了解更多信息。

后退

Linux 上的安装