#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 в соответствии с вашими настройками.