安装后运行测试时,MongoDB C ++驱动程序(mongocxx)单个未解析的外部符号(mongocxx :: v_noabi :: uri :: k_default_uri)

时间:2019-06-14 15:47:17

标签: c++ mongodb mongo-cxx-driver mongo-c-driver

在过去的两天内,我尝试在两台不同的Windows 10计算机上构建和测试mongocxx,一台使用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)

我用Boost 1.59,Boost 1.68,Boost 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和static链接应用程序   不支持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位,但是也许我看不到

这是我分别用于c驱动程序和cxx驱动程序的cmake命令:

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上发现的唯一相关问题是:Compiler error with new MongoDB C++ driver,他们得出结论:“这与bson和mongocxx的库编译和安装不正确有关”。我可以很好地编译这些库,但是它们仍然会导致此错误。所以也许我以某种方式错误地编译了它们?我真的迷路了,这证明了在多年来的编程中,这是我第一次发布到stackoverflow。

0 个答案:

没有答案