Драйвер MongoDB C ++ (mongocxx) один неразрешенный внешний символ (mongocxx :: v_noabi :: uri :: k_default_uri) при запуске теста после установки - PullRequest
0 голосов
/ 14 июня 2019

В течение последних двух дней я пытался собрать и протестировать 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.

...