高级配置和安装选项
在此页面上
为集成商提供的其他选项
如果您正在构建 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
的内容来链接(可能会将特定标志调整为链接器所需的标志)。
安装MongoDB C驱动程序
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
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 .x 或3.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 文档 以了解更多信息。