nhận xét sơ bộ
Trong khi xem xét chi tiết, đây là một vài nhận xét sơ bộ:
- Sử dụng thư mục khác cho
SOURCE_DIR
vàBINARY_DIR
- Thay vì
CMAKE_ARG
, thíchCMAKE_CACHE_ARGS
-
libbson-1.0_DIR
KHÔNG được đặt thành thư mục nguồn, thay vào đó nếu nên được đặt thành thư mục xây dựng có chứaconfig-file
gói (liên kết bên dưới cung cấp thêm chi tiết về khái niệm này) - Đảm bảo luôn chỉ định loại đối số CMake (
-DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER}
thay vì-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
) - Không đặt
CMAKE_BUILD_TYPE
cho trình tạo đa cấu hình
Về điểm cuối cùng này, điều này có nghĩa là bạn nên làm như sau:
set(EXTERNAL_PROJECT_OPTIONAL_CMAKE_CACHE_ARGS)
if(NOT DEFINED CMAKE_CONFIGURATION_TYPES)
list(APPEND EXTERNAL_PROJECT_OPTIONAL_CMAKE_CACHE_ARGS
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
)
endif()
Trong bài đăng này, bạn có thể tìm hiểu cách bạn có thể cấu trúc dự án của mình:Cách đúng để sử dụng thư viện của bên thứ ba trong dự án cmake
dự án làm việc cho phép biên dịch mongocxx "test.cpp"
Dưới đây là nội dung của CMakeLists.txt
và test.cpp
cho phép tạo tệp thực thi có tên <build-dir>/Test-build/test_mongocxx
:
-
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12) set(CMAKE_CXX_STANDARD 11) project(Test) option(${PROJECT_NAME}_SUPERBUILD "Build ${PROJECT_NAME} and the projects it depends on." ON) if(${PROJECT_NAME}_SUPERBUILD) include(ExternalProject) set(common_cmake_cache_args -DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER} ) if(NOT DEFINED CMAKE_CONFIGURATION_TYPES) list(APPEND common_cmake_cache_args -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} ) endif() ExternalProject_Add(libmongoc GIT_REPOSITORY "https://github.com/mongodb/mongo-c-driver.git" GIT_TAG "1.12.0" GIT_PROGRESS 1 GIT_SHALLOW 1 SOURCE_DIR "${CMAKE_BINARY_DIR}/libmongoc" BINARY_DIR "${CMAKE_BINARY_DIR}/libmongoc-build" INSTALL_DIR "${CMAKE_BINARY_DIR}/libmongoc-install" CMAKE_CACHE_ARGS ${common_cmake_cache_args} -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/libmongoc-install -DENABLE_TESTS:BOOL=OFF -DENABLE_STATIC:BOOL=OFF -DENABLE_EXAMPLES:BOOL=OFF -DENABLE_EXTRA_ALIGNMENT:BOOL=OFF #INSTALL_COMMAND "" ) set(libmongoc-1.0_DIR "${CMAKE_BINARY_DIR}/libmongoc-install/lib/cmake/libmongoc-1.0/") set(libbson-1.0_DIR "${CMAKE_BINARY_DIR}/libmongoc-install/lib/cmake/libbson-1.0/") ExternalProject_Add(libmongocxx GIT_REPOSITORY "https://github.com/mongodb/mongo-cxx-driver.git" GIT_TAG "r3.3.1" GIT_PROGRESS 1 GIT_SHALLOW 1 SOURCE_DIR "${CMAKE_BINARY_DIR}/libmongocxx" BINARY_DIR "${CMAKE_BINARY_DIR}/libmongocxx-build" INSTALL_DIR "${CMAKE_BINARY_DIR}/libmongocxx-install" CMAKE_CACHE_ARGS ${common_cmake_cache_args} -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/libmongocxx-install -DBUILD_SHARED_LIBS:BOOL=ON -DENABLE_TESTS:BOOL=OFF -DENABLE_EXAMPLES:BOOL=OFF -DBSONCXX_POLY_USE_BOOST:BOOL=OFF -DBSONCXX_POLY_USE_MNMLSTC:BOOL=ON -DBSONCXX_POLY_USE_STD:BOOL=OFF -Dlibmongoc-1.0_DIR:PATH=${libmongoc-1.0_DIR} -Dlibbson-1.0_DIR:PATH=${libbson-1.0_DIR} DEPENDS libmongoc ) set(libmongocxx_DIR "${CMAKE_BINARY_DIR}/libmongocxx-install/lib/cmake/libmongocxx-3.3.1/") set(libbsoncxx_DIR "${CMAKE_BINARY_DIR}/libmongocxx-install//lib/cmake/libbsoncxx-3.3.1/") function(ExternalProject_AlwaysConfigure proj) # This custom external project step forces the configure and later # steps to run. _ep_get_step_stampfile(${proj} "configure" stampfile) ExternalProject_Add_Step(${proj} forceconfigure COMMAND ${CMAKE_COMMAND} -E remove ${stampfile} COMMENT "Forcing configure step for '${proj}'" DEPENDEES build ALWAYS 1 ) endfunction() ExternalProject_Add(${PROJECT_NAME} SOURCE_DIR "${CMAKE_SOURCE_DIR}" BINARY_DIR "${CMAKE_BINARY_DIR}/${PROJECT_NAME}-build" DOWNLOAD_COMMAND "" UPDATE_COMMAND "" CMAKE_CACHE_ARGS ${common_cmake_cache_args} -D${PROJECT_NAME}_SUPERBUILD:BOOL=OFF -Dlibbsoncxx_DIR:PATH=${libbsoncxx_DIR} -Dlibmongocxx_DIR:PATH=${libmongocxx_DIR} INSTALL_COMMAND "" DEPENDS libmongocxx ) ExternalProject_AlwaysConfigure(${PROJECT_NAME}) return() endif() message(STATUS "Configuring inner-build") find_package(libmongocxx REQUIRED) add_executable(test_mongocxx test.cpp) target_link_libraries(test_mongocxx PUBLIC ${LIBMONGOCXX_LIBRARIES}) target_include_directories(test_mongocxx PUBLIC ${LIBMONGOCXX_INCLUDE_DIRS}) target_compile_definitions(test_mongocxx PUBLIC ${LIBMONGOCXX_DEFINITIONS})
-
test.cpp (được sao chép từ https://mongodb.github.io/mongo-cxx-driver/mongocxx-v3/installation/#step-6-test-your-installation):
#include <iostream> #include <bsoncxx/builder/stream/document.hpp> #include <bsoncxx/json.hpp> #include <mongocxx/client.hpp> #include <mongocxx/instance.hpp> int main(int, char**) { mongocxx::instance inst{}; mongocxx::client conn{mongocxx::uri{}}; bsoncxx::builder::stream::document document{}; auto collection = conn["testdb"]["testcollection"]; document << "hello" << "world"; collection.insert_one(document.view()); auto cursor = collection.find({}); for (auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; } }