В течение последних двух дней я пытался собрать и протестировать mongocxx на двух разных машинах с Windows 10, один из которых использовал VS2015, а другой - VS2017. Сборки устанавливаются без ошибок (хотя у меня были начальные проблемы с ENABLE_EXTRA_ALIGNMENT). Однако, как только я пытаюсь создать точный тестовый код из руководства по установке MongoDB (http://mongocxx.org/mongocxx-v3/installation/),, я получаю следующую ошибку компоновщика:
error LNK2001: unresolved external symbol "public: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const mongocxx::v_noabi::uri::k_default_uri" (?k_default_uri@uri@v_noabi@mongocxx@@2V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@B)
Я перестроил с бустом 1,59, бустом 1,68, бустом 1,70 и использую C ++ 17 без буста.
Я тестировал сборки с mongocxx 3.4.0 с mongoc 1.14.0 и mongocxx 3.3.1 с mongoc 1.10.1, и это всегда ошибка, с которой я сталкиваюсь.
Я знаю, что Visual Studio видит mongocxx.lib, потому что, если я удаляю его, я получаю кучу ошибок компоновщика, а не одну.
Единственный способ запустить тестовую программу - это собрать mongocxx со статическими библиотеками и связать их вместе с общими библиотеками для драйвера mongo c в тестовой программе. Однако это не кажется правильным решением, поскольку, как говорится в руководстве по установке:
Связывание приложения как с общим libmongoc, так и со статическим
mongocxx не поддерживается и не связывается с обоими статическими
libmongoc и общий mongocxx.
Что также раздражает, так это то, что если я открываю mongocxx.lib и ищу «? K_default_uri @ uri ...», я нахожу это. Так что там. Но что-то не так, по-видимому.
Обратите внимание, что, если я закомментирую все, что находится ниже первой строки в основной функции, вот так:
#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;
}
*/
}
Затем он прекрасно компилирует и запускает эту часть.
Это определенно часть "mongocxx :: uri {}", которую он не может разрешить
Что-то строится как 32-битное, что я не понимаю? Или что-то строится в режиме релиза, чего я не понимаю? Мои сборки mongocxx и mongo c все говорят, что Debug / 64 bit, но, возможно, есть что-то, чего я не вижу
Вот мои команды cmake для драйвера c и драйвера cxx соответственно:
cmake -G "Visual Studio 15 2017 Win64" "-DCMAKE_BUILD_TYPE=Debug" "-DENABLE_EXTRA_ALIGNMENT=OFF" "-DCMAKE_INSTALL_PREFIX=C:\<path removed>\mongo-c-driver" "-DCMAKE_PREFIX_PATH=C:\<path removed>\mongo-c-driver" ..
cmake -G "Visual Studio 15 2017 Win64" "-DCMAKE_BUILD_TYPE=Debug" "-DBSONCXX_POLY_USE_BOOST=1" "-DCMAKE_INSTALL_PREFIX=C:\<path removed>\mongo-cxx-driver" "-DCMAKE_PREFIX_PATH=C:\<path removed>\mongo-c-driver" "-DBOOST_ROOT=C:\<path removed>\boost_1_68_0" ..
И после каждого из них я запускаю следующее:
msbuild.exe /p:Configuration=Debug ALL_BUILD.vcxproj
msbuild.exe /p:Configuration=Debug INSTALL.vcxproj
И это соответствующие свойства из моего проекта VS:
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\libraries\boost_1_68_0;$(ProjectDir)..\..\..\libraries\mongo-cxx-driver\include\mongocxx\v_noabi;$(ProjectDir)..\..\..\libraries\mongo-c-driver\include\include\libmongoc-1.0;$(ProjectDir)..\..\..\libraries\mongo-c-driver\include\libbson-1.0;$(ProjectDir)..\..\..\libraries\mongo-cxx-driver\include\bsoncxx\v_noabi</AdditionalIncludeDirectories>
<PreprocessorDefinitions>MONGOCXX_STATIC;BSONCXX_STATIC;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>$(ProjectDir)..\..\..\libraries\boost_1_68_0\stage\lib;$(ProjectDir)..\..\..\libraries\mongo-c-driver\lib;$(ProjectDir)..\..\..\libraries\mongo-cxx-driver\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>mongocxx.lib;bsoncxx.lib;mongoc-static-1.0.lib;bson-1.0.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
Единственный релевантный вопрос, который я обнаружил в stackoverflow, заключается в следующем: Ошибка компилятора с новым драйвером MongoDB C ++ , и они пришли к выводу: «Это связано с неправильно скомпилированными и установленными библиотеками для bson и mongocxx». Я могу прекрасно скомпилировать библиотеки, но они все равно приводят к этой ошибке. Так может я их как-то неправильно компилирую? Я действительно потерян, и доказательством этого является то, что за годы программирования я впервые опубликовал в stackoverflow.