монго-cxx-библиотека драйверов создается, но проблемы с постоянным связыванием и отладкой

#c #mongodb #boost #visual-studio-2015 #mongo-cxx-driver

#c #mongodb #повышение #visual-studio-2015 #монго-cxx-драйвер

Вопрос:

Я пытаюсь создать mongo-cxx-driver для использования с Cinder в Windows 10 с Visual Studio 2015. Cinder использует Boost 1.58, поэтому я создал драйвер для включенной в него версии Boost.

Я пытался следовать инструкциям точно так, как описано на github, но у последних библиотек и библиотек DLL, которые я получаю, похоже, есть проблема с ними. Я бы хотел получить помощь в отладке, где моя компиляция пошла не так!

Вот что я сделал, отразив официальные инструкции здесь

Шаг 1

Я следовал инструкциям здесь для установки драйвера MongoDB C. Простое копирование / вставка вызовов CMake в соответствии с инструкциями по сборке Windows сработало отлично.

Шаг 2

Поскольку я использую Windows и Visual Studio 2015, я должен использовать опцию Boost для Polyfill.

Шаг 3

Я отключил mongo-cxx-driver-3.0.2, который я загрузил с github; затем я вошел mongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2 и запустил CMake:

cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_INSTALL_PREFIX=C:mongo-cxx-driver -DLIBBSON_DIR=C:mongo-c-driver -DBoost_INCLUDE_DIR=C:Cinderinclude -DLIBMONGOC_DIR=C:mongo-c-driver -DBSONCXX_POLY_USE_BOOST=1 ..

А затем собрал и установил проект:

 msbuild.exe ./ALL_BUILD.vcxproj
msbuild.exe ./INSTALL.vcxproj
  

Все работает отлично, и я получаю подтверждение от CMake, что ошибок не было. Ура!

Проблемы

Во время тестирования я попытался запустить тестовую программу

 #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::printf("Starting mongo-cxx-driver test...n");
    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 (autoamp;amp; doc : cursor) {
        std::cout << bsoncxx::to_json(doc) << std::endl;
    }
    std::printf("End of demo!n");
}
  

Если я запускаю его в режиме отладки, то он выходит из строя после распечатки базы данных с сообщением «Ошибка утверждения отладки»:

 File: minkernel/crts/ucrt/src/appcrt/heap/debug_heap.cpp
Line: 980
Expression: __acrt_first_block == header
  

Checking the breakpoint shows that it causes the error on the line at the end of the file — probably during cleanup from the line

 std::cout << bsoncxx::to_json(doc) << std::endl
  

My first suspicion was that perhaps the .lib files and .dll were built for release — so I built it in release.

I get an error mongo_test.exe has triggered a breakpoint with the breakpoint deep inside of bsoncxx.dll!bsoncxx::v_noabi::string::view_or_value::terminated() .

При попытке удаления я меняю строку вставки на:

 mongocxx::result::insert_one result = collection.insert_one(document.view());
  

в попытке собрать больше отладочной информации. Я был удивлен, обнаружив, что это не будет компилироваться с ошибкой C2440:

 'initializing': cannot convert from 'boost::optional<mongocxx::v_noabi::result::insert_one>' to 'mongocxx::v_noabi::result::insert_one' mongo_test  C:mongo_testsrcmongo_testApp.cpp 39  
  

Я подозреваю, что, возможно, проблема в том, как я связал Boost / std::experimental, но я попробовал несколько разных вариантов (отключение использования boost и использование std::experimental вместо polyfill), но, похоже, это не создает рабочую библиотеку. Или, возможно, есть несоответствие с Debug / Release или x64 против x86?

Кто-нибудь может определить ошибку в этом процессе сборки?

Спасибо!

[РЕДАКТИРОВАТЬ] Запустил включенные тесты в mongo-cxx-driver, включая вывод здесь для целей отладки:

 ~Downloadsmongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2> MSBuild.exe .RUN_TESTS.vcxproj
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 10/12/2016 3:03:11 PM.
Project "~Downloadsmongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj" on node 1 (default targets).
Project "~Downloadsmongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj" (1) is building "~Downloadsmongo-cxx-dr
iver-r3.0.2mongo-cxx-driver-r3.0.2ZERO_CHECK.vcxproj" (2) on node 1 (default targets).
InitializeBuildStatus:
  Creating "x64DebugZERO_CHECKZERO_CHECK.tlogunsuccessfulbuild" because "AlwaysCreate" was specified.
CustomBuild:
  All outputs are up-to-date.
FinalizeBuildStatus:
  Deleting file "x64DebugZERO_CHECKZERO_CHECK.tlogunsuccessfulbuild".
  Touching "x64DebugZERO_CHECKZERO_CHECK.tlogZERO_CHECK.lastbuildstate".
Done Building Project "~Downloadsmongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2ZERO_CHECK.vcxproj" (default targets).

PrepareForBuild:
  Creating directory "x64DebugRUN_TESTS".
  Creating directory "x64DebugRUN_TESTSRUN_TESTS.tlog".
InitializeBuildStatus:
  Creating "x64DebugRUN_TESTSRUN_TESTS.tlogunsuccessfulbuild" because "AlwaysCreate" was specified.
PostBuildEvent:
  setlocal
  "C:Program FilesCMakebinctest.exe" --force-new-ctest-process -C Debug
  if %errorlevel% neq 0 goto :cmEnd
  :cmEnd
  endlocal amp; call :cmErrorLevel %errorlevel% amp; goto :cmDone
  :cmErrorLevel
  exit /b %1
  :cmDone
  if %errorlevel% neq 0 goto :VCEnd
  :VCEnd
  Test project C:/Users/nathan lachenmyer/Downloads/mongo-cxx-driver-r3.0.2/mongo-cxx-driver-r3.0.2
      Start 1: bson
  1/3 Test #1: bson .............................***Exception: Other  0.00 sec
      Start 2: driver
  2/3 Test #2: driver ...........................***Exception: Other  0.01 sec
      Start 3: instance
  3/3 Test #3: instance .........................***Exception: Other  0.00 sec

  0% tests passed, 3 tests failed out of 3
  Errors while running CTest

  Total Test time (real) =   0.03 sec

  The following tests FAILED:
          1 - bson (OTHER_FAULT)
          2 - driver (OTHER_FAULT)
          3 - instance (OTHER_FAULT)
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: The command "setlocalr [~Downloadsmongo-cxx-d
river-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: "C:Program FilesCMakebinctest.exe" --force-new-ctest-process -C Debug
r [~Downloadsmongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: if %errorlevel% neq 0 goto :cmEndr [~Downloads
mongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: :cmEndr [~Downloadsmongo-cxx-driver-r3.0.2mo
ngo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: endlocal amp; call :cmErrorLevel %errorlevel% amp; goto :cmDoner [C:Usersnat
han lachenmyerDownloadsmongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: :cmErrorLevelr [~Downloadsmongo-cxx-driver-r3
.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: exit /b %1r [~Downloadsmongo-cxx-driver-r3.0.
2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: :cmDoner [~Downloadsmongo-cxx-driver-r3.0.2m
ongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: if %errorlevel% neq 0 goto :VCEndr [~Downloads
mongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: :VCEnd" exited with code 8. [~Downloadsmongo-c
xx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
Done Building Project "~Downloadsmongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj" (default targets) -- FAILED.


Build FAILED.

"~Downloadsmongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj" (default target) (1) ->
(PostBuildEvent target) ->
  C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: The command "setlocalr [~Downloadsmongo-cxx
-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: "C:Program FilesCMakebinctest.exe" --force-new-ctest-process -C Debug
r [~Downloadsmongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: if %errorlevel% neq 0 goto :cmEndr [~Downloads
mongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: :cmEndr [~Downloadsmongo-cxx-driver-r3.0.2mo
ngo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: endlocal amp; call :cmErrorLevel %errorlevel% amp; goto :cmDoner [C:Usersnat
han lachenmyerDownloadsmongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: :cmErrorLevelr [~Downloadsmongo-cxx-driver-r3
.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: exit /b %1r [~Downloadsmongo-cxx-driver-r3.0.
2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: :cmDoner [~Downloadsmongo-cxx-driver-r3.0.2m
ongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: if %errorlevel% neq 0 goto :VCEndr [~Downloads
mongo-cxx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppCommon.targets(133,5): error MSB3073: :VCEnd" exited with code 8. [~Downloadsmongo-c
xx-driver-r3.0.2mongo-cxx-driver-r3.0.2RUN_TESTS.vcxproj]

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:00.71
  

Комментарии:

1. Можете ли вы попробовать драйвер 3.0.2 и повысить версию 1.59? У нас были сообщения об успехе в MSVC с этой комбинацией.

2. Существуют ли известные проблемы с MSVC при использовании драйвера 3.0.1 и Boost 1.58?

3. Известных проблем нет, но мы также не тестировали эту комбинацию специально.

4. Попытка использования драйвера версии v3.0.2 разрешила основные проблемы с компоновщиком — я не получаю проблем с несвязанными объектами. Но я все еще получаю сбои в режиме отладки и точки останова в режиме выпуска.

5. Я попытался запустить тесты, и сборка завершилась неудачно во всех 3 тестах. Я перестроил mongo-c-driver с версией 1.3.4 в соответствии с README, но он по-прежнему терпит неудачу.

Ответ №1:

Я знаю, что это старый вопрос, но я столкнулся с ним сегодня, поэтому я опубликую свое решение здесь, кому бы оно ни было интересно. Это происходит только в режиме отладки, ошибка прекратилась, когда я изменил /MD на /MDd . Вероятно, вам придется перекомпилировать mongocxx в соответствии с вашими настройками.