Я пытаюсь протестировать драйвер mongodb C++ на Ubuntu 16.04.
Драйвер установлен в ${Devfolder}/sdk/mongodb/
и тест находится в ${Devfolder}/testMongoDb/.
Код был скомпилирован и протестирован с использованием:
export PKG_CONFIG_PATH=${Devfolder}/sdk/mongodb/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${Devfolder}/sdk/mongodb/lib
c++ --std=c++11 test.cpp -o test $(pkg-config --cflags --libs libmongocxx)
Затем я хочу использовать драйвер mongodb в моем проекте CMake.
ugitho@ugitho:projects$ tree -L 3
.
├── sdk
│ └── mongodb
│ ├── bin
│ ├── include
│ ├── lib
│ └── share
├── testMongo
│ ├── a.out
│ ├── build
│ │ ├── CMakeCache.txt
│ │ ├── CMakeFiles
│ │ ├── cmake_install.cmake
│ │ ├── cmongodb
│ │ └── Makefile
│ ├── CMakeLists.txt
│ ├── test
│ └── test.cpp
Но я получил следующую ошибку:
ugitho@ugitho:build$ cmake ..
LIBMONGOCXX_INCLUDE_DIRS = /home/ugitho/NGUYENKHAC/projects/sdk/mongodb/include/mongocxx/v_noabi;/home/ugitho/NGUYENKHAC/projects/sdk/mongodb/include/bsoncxx/v_noabi
LIBMONGOCXX_LIBRARIES = LIBMONGOCXX_LIBRARY_PATH-NOTFOUND;LIBBSONCXX_LIBRARY_PATH-NOTFOUND
LIBBSONCXX_INCLUDE_DIRS = /home/ugitho/NGUYENKHAC/projects/sdk/mongodb/include/bsoncxx/v_noabi
LIBBSONCXX_LIBRARIES = LIBBSONCXX_LIBRARY_PATH-NOTFOUND
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
LIBBSONCXX_LIBRARY_PATH
linked by target "cmongodb" in directory
/home/ugitho/NGUYENKHAC/projects/testMongoDb
linked by target "cmongodb" in directory
/home/ugitho/NGUYENKHAC/projects/testMongoDb
LIBMONGOCXX_LIBRARY_PATH
linked by target "cmongodb" in directory
/home/ugitho/NGUYENKHAC/projects/testMongoDb
-- Configuring incomplete, errors occurred!
See also "/home/ugitho/NGUYENKHAC/projects/testMongoDb/build/CMakeFiles/CMakeOutput.log".
отредактировано *:
Вот CMakeLists.txt и test.cpp.
CMakeLists.txt:
cmake_minimum_required(VERSION 3.2)
project(cmongodb)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_PREFIX_PATH /home/ugitho/NGUYENKHAC/projects/sdk/mongodb)
#find_package(libmongocxx REQUIRED)
#find_package(libbsoncxx REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBMONGOCXX REQUIRED libmongocxx)
pkg_check_modules(LIBBSONCXX REQUIRED libbsoncxx)
message("LIBMONGOCXX_INCLUDE_DIRS = ${LIBMONGOCXX_INCLUDE_DIRS}")
message("LIBMONGOCXX_LIBRARIES = ${LIBMONGOCXX_LIBRARIES}")
message("LIBBSONCXX_INCLUDE_DIRS = ${LIBBSONCXX_INCLUDE_DIRS}")
message("LIBBSONCXX_LIBRARIES = ${LIBBSONCXX_LIBRARIES}")
set(COMMON_LIBRARIES ${LIBMONGOCXX_LIBRARIES} ${LIBBSONCXX_LIBRARIES})
set(SOURCE_FILES test.cpp)
add_executable(cmongodb ${SOURCE_FILES})
target_include_directories(cmongodb PUBLIC ${LIBMONGOCXX_INCLUDE_DIRS})
target_include_directories(cmongodb PUBLIC ${LIBBSONCXX_INCLUDE_DIRS})
target_link_libraries(cmongodb ${COMMON_LIBRARIES})
test.cpp:
#include <iostream>
#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
int main(int, char **) {
std::cout << "1" << std::endl;
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;
}
return 0;
}
Вы хоть представляете, что я здесь пропустил?
Обновления:
с новым CMakeLists.txt ошибок cmake больше нет.
ugitho@ugitho:build$ cmake ..
-- Checking for module 'libmongocxx'
-- Found libmongocxx, version 3.4.0
-- Checking for module 'libbsoncxx'
-- Found libbsoncxx, version 3.4.0
CMAKE_PREFIX_PATH = /home/ugitho/NGUYENKHAC/projects/sdk/mongodb/shared
LIBMONGOCXX_INCLUDE_DIRS = /home/ugitho/NGUYENKHAC/projects/sdk/mongodb/include/mongocxx/v_noabi;/home/ugitho/NGUYENKHAC/projects/sdk/mongodb/include/bsoncxx/v_noabi
LIBMONGOCXX_LIBRARIES = mongocxx;bsoncxx
LIBBSONCXX_INCLUDE_DIRS = /home/ugitho/NGUYENKHAC/projects/sdk/mongodb/include/bsoncxx/v_noabi
LIBBSONCXX_LIBRARIES = bsoncxx
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ugitho/NGUYENKHAC/projects/testMongoDb/build
[1]+ Done gedit /home/ugitho/NGUYENKHAC/projects/testMongoDb/build/CMakeFiles/CMakeOutput.log
Теперь ошибки находятся на уровне make:
ugitho@ugitho:build$ make
Scanning dependencies of target cmongodb
[ 50%] Building CXX object CMakeFiles/cmongodb.dir/test.cpp.o
[100%] Linking CXX executable cmongodb
/opt/llvm/x86_64/6.0.0.g631a/bin/ld: error: unable to find library -lmongocxx
/opt/llvm/x86_64/6.0.0.g631a/bin/ld: error: unable to find library -lbsoncxx
/opt/llvm/x86_64/6.0.0.g631a/bin/ld: error: unable to find library -lbsoncxx
collect2: error: ld returned 1 exit status
make[2]: *** [cmongodb] Error 1
make[1]: *** [CMakeFiles/cmongodb.dir/all] Error 2
make: *** [all] Error 2
ОБНОВЛЕНИЕ *** 27/12/2018
cmake_minimum_required(VERSION 3.2)
project(cmongodb)
set(CMAKE_CXX_STANDARD 14)
get_filename_component(PARENT_DIR ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY)
set(CMAKE_PREFIX_PATH ${PARENT_DIR}/sdk/mongodb)
message("CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
find_package(libmongocxx REQUIRED)
find_package(libbsoncxx REQUIRED)
set(MongoDb_INCLUDE_DIR ${PARENT_DIR}/sdk/mongodb/include)
include_directories(${MongoDb_INCLUDE_DIR}/mongocxx/v_noabi
${MongoDb_INCLUDE_DIR}/bsoncxx/v_noabi)
set(SOURCE_FILES test.cpp)
add_executable(cmongodb ${SOURCE_FILES})
target_link_libraries(cmongodb ${LIBMONGOCXX_LIBRARIES}
${LIBBSONCXX_LIBRARIES})
Мне удалось скомпилировать с помощью этого CMakeLists.txt.
новая конфигурация проекта будет в ближайшее время. {GTest & Boost & MongoDb C++ Driver}
Спасибо!!
Спасибо за ваш комментарий. Я обновил сообщение об ошибке.
libbsoncxx является частью MongoDB. Вероятно, вам нужно намекнуть CMake о каталоге установки MongoDB, например установив для переменной CMAKE_PREFIX_PATHокружающая обстановка значение ${Devfolder}/sdk/mongodb. Если это не помогает, попробуйте найти один из файлов, перечисленных в сообщении об ошибке (libbsoncxxConfig.cmake или libbsoncxx-config.cmake), в каталоге установки MongoDB.
Добавление набора (CMAKE_PREFIX_PATH $ {Devfolser} SDK / MongoDB) и пытается бревнами: сообщение сообщения ( "LIBMONGOCXX_INCLUDE_DIRS = $ {LIBMONGOCXX_INCLUDE_DIRS}") ( "LIBMONGOCXX_LIBRARIES = $ {LIBMONGOCXX_LIBRARIES}") сообщения ( "LIBBSONCXX_INCLUDE_DIRS = $ {LIBBSONCXX_INCLUDE_DIRS}") message ("LIBBSONCXX_LIBRARIES = $ {LIBBSONCXX_LIBRARIES}"), но, видимо, это не работает:
LIBMONGOCXX_INCLUDE_DIRS = $ {Devfolder} / SDK / MongoDB / включать / mongocxx / v_noabi; $ {Devfolde г} / SDK / MongoDB / inclu де / bsoncxx / v_noabi LIBMONGOCXX_LIBRARIES = LIBMONGOCXX_LIBRARY_PATH-NOTFOUND; LIBBSONCXX_LIBRARY_PATH-NO TFOUND LIBBSONCXX_INCLUDE_DIRS = $ { Devfolder} / sdk / mongodb / include / bsoncxx / v_noabi LIBBSONCXX_LIBRARIES = LIBBSONCXX_LIBRARY_PATH-NOTFOUND
Комментарии плохо подходят для многострочного кода. Лучше обновите вопрос, добавив в него дополнительную информацию. Итак, установка CMAKE_PREFIX_PATH помогает хотя бы частично - он находит подключаемые каталоги, но не библиотеки. Кстати, в исходном коде вы используете LIBMONGOCXX_STATIC_LIBRARIES - возможно, вам стоит проверить значение этой переменной вместо значения LIBMONGOCXX_LIBRARIES. (Я не знаю, какую переменную следует использовать на самом деле).
Простите @Tsyvarev! Я обновил CmakeLists.txt и логи.
Для справки в будущем: после того, как вы добавили CMAKE_PREFIX_PATH, но по-прежнему получили ошибку компоновщика: unable to find library -lbsoncxx, это произошло потому, что компоновщик не знал путь к bsoncxx. Вы могли использовать переменную {LIBBSON_CXX_LINKER}, которая включает абсолютный путь глянь сюда. При этом использование find_package, как и вы, в любом случае кажется предпочтительным, чем использование PkgConfig.





Сообщение об ошибке не соответствует отображаемому вами
CMakeLists.txt. Используяfind_package, вы выполняете поиск «libbsoncxx», но сообщение об ошибке соответствует найденному пакету «libbsoncxx-static». Пожалуйста, покажите фактический код и сообщение об ошибке, которые он производит.