v3.1 CXX Driver: Linker errors when compiling on Ubuntu 16.14 using libcinder

806 visualizações
Pular para a primeira mensagem não lida

Blake McConnell

não lida,
18 de jan. de 2017, 08:46:0418/01/2017
para mongodb-user
I have a rather large project using the graphics/multimedia library libcinder.  In attempting to integrate the 3.1 CXX driver into the project, I've run into some strange linker/runtime issues.  I created a small demo program using the CXX driver that does not include Cinder.  This program links and runs perfectly as expected.  The same code built with Cinder results in the same linker/runtime errors I see with the larger project.  I'm on Ubuntu 16.04, and am linking Mongo/BSON static lib files built with the default C++17 polyfill.  I'm using CLion 2016.3 to compile which uses CMake 3.6.2.  Make version 4.1.  GCC version 5.4.0.  I built static libcinder libs from source.  Code posted below.

main.cpp:

#include "cinder/app/App.h"
#include "cinder/app/RendererGl.h"
#include "cinder/gl/gl.h"

#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>
#include <bsoncxx/stdx/make_unique.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/logger.hpp>

class BasicApp : public ci::app::App {
public:
void setup() override;
};

void BasicApp::setup()
{
using bsoncxx::builder::stream::document;
using bsoncxx::builder::stream::finalize;
using bsoncxx::types::b_date;
using bsoncxx::builder::stream::open_document;
using bsoncxx::builder::stream::close_document;

//get system hostname
char hostname[ 256 ];
gethostname( hostname, 256 );
mongocxx::database db;

try {
//connect to db
std::string uriStr = "mongodb://localhost:27017";
const auto uri = mongocxx::uri(uriStr);

auto client = mongocxx::client{uri};

db = client["testdb"];
}
catch (const std::exception& xcp) {
std::cout << "connection failed: " << xcp.what() << "\n";
return;
}

//write a test document
bsoncxx::document::value testRecord = document{}
<< "machine_id" << hostname
<< "session_id" << "session_010101"
<< "date" << "date_placeholder"
<< "data" << open_document
<< "name" << "test"
<< "id" << "test"
<< close_document
<< finalize;

std::cout << bsoncxx::to_json( testRecord ) << std::endl; //this line causes a linker error
auto res = db[ "test" ].insert_one( std::move( testRecord ));
}

CINDER_APP( BasicApp, ci::app::RendererGl )

CMakeLists.txt:

cmake_minimum_required(VERSION 3.6)
project(mongo_test)

set(CMAKE_CXX_STANDARD 11)

set(CINDER_PATH ../3rd_party/Cinder)

find_package(PkgConfig REQUIRED)

pkg_check_modules(LIBMONGOCXX REQUIRED libmongocxx)
pkg_check_modules(LIBBSONCXX REQUIRED libbsoncxx)

set(INCLUDE_FILES ${CINDER_PATH}/include ${LIBMONGOCXX_INCLUDE_DIRS} ${LIBBSONCXX_INCLUDE_DIRS})
set(SOURCE_FILES ${PROJECT_SOURCE_DIR}/main.cpp)

include( "${CINDER_PATH}/proj/cmake/modules/cinderMakeApp.cmake" )

ci_make_app(
SOURCES ${SOURCE_FILES}
INCLUDES ${INCLUDE_FILES}
CINDER_PATH ${CINDER_PATH}
LIBRARIES ${LIBMONGOCXX_LIBRARIES} ${LIBBSONCXX_LIBRARIES}
)


Here's the linker error I get when I try to compile as-is:
  • undefined reference to `bsoncxx::v_noabi::to_json(bsoncxx::v_noabi::document::view)'
If I comment out the offending line, main.cpp 55, it compiles, but I get runtime errors.   Again, if I don't compile with Cinder, this code works fine.

Any suggestions are greatly appreciated!

Rassi

não lida,
18 de jan. de 2017, 14:47:1618/01/2017
para mongodb-user
Could you post the exact link command being run which generates that error?  You can see the exact link command by setting the CMAKE_VERBOSE_MAKEFILE CMake variable, or by passing VERBOSE=1 to your make invocation.

Could you also post the exact runtime error you see when you compile/link your program with main.cpp:55 commented out?  Please also include the output of running ldd on your program. 

Thanks.
~ rassi

Blake McConnell

não lida,
18 de jan. de 2017, 17:33:1218/01/2017
para mongodb-user
Here's the link command:

/usr/bin/c++   -g   CMakeFiles/mongo_test.dir/main.cpp.o  -o ../build/Debug/mongo_test/mongo_test /code/ai_core_backend_v2/AIBackend/3rd_party/Cinder/lib/linux/x86_64/ogl/Debug/libcinder.a /usr/local/lib/libmongocxx.a /usr/local/lib/libbsoncxx.a /usr/local/lib/libmongoc-1.0.a /usr/local/lib/libbson-1.0.a -lpthread -lrt -lssl -lcrypto /usr/lib/x86_64-linux-gnu/libGLU.so /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libSM.so /usr/lib/x86_64-linux-gnu/libICE.so /usr/lib/x86_64-linux-gnu/libX11.so /usr/lib/x86_64-linux-gnu/libXext.so -lXcursor -lXinerama -lXrandr -lXi /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/x86_64-linux-gnu/libcurl.so /usr/lib/x86_64-linux-gnu/libfontconfig.so /usr/lib/x86_64-linux-gnu/libpulse.so /usr/lib/x86_64-linux-gnu/libmpg123.so /usr/lib/x86_64-linux-gnu/libsndfile.so /usr/lib/x86_64-linux-gnu/libgobject-2.0.so /usr/lib/x86_64-linux-gnu/libglib-2.0.so /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so /usr/lib/x86_64-linux-gnu/libgstbase-1.0.so /usr/lib/x86_64-linux-gnu/libgstapp-1.0.so /usr/lib/x86_64-linux-gnu/libgstvideo-1.0.so /usr/lib/x86_64-linux-gnu/libgstgl-1.0.so /code/ai_core_backend_v2/AIBackend/3rd_party/Cinder/lib/linux/x86_64//libboost_system.a /code/ai_core_backend_v2/AIBackend/3rd_party/Cinder/lib/linux/x86_64//libboost_filesystem.a -ldl -lpthread

the runtime error I see is a std::exception that gets thrown when the client tries to connect: basic_string::_M_construct null not valid

Here's the ldd output:

    linux-vdso.so.1 =>  (0x00007ffd36ade000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6d1ec25000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f6d1ea1d000)
    libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f6d1e7b3000)
    libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f6d1e36f000)
    libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f6d1e0fe000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f6d1ddc3000)
    libXcursor.so.1 => /usr/lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f6d1dbb9000)
    libXinerama.so.1 => /usr/lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f6d1d9b6000)
    libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f6d1d7aa000)
    libcurl-gnutls.so.4 => /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 (0x00007f6d1d53d000)
    libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f6d1d2fa000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6d1d0f5000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6d1cd73000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6d1ca6a000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6d1c853000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6d1c48a000)
    /lib64/ld-linux-x86-64.so.2 (0x000055b8c5d88000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f6d1c261000)
    libxcb-dri3.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0 (0x00007f6d1c05d000)
    libxcb-present.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-present.so.0 (0x00007f6d1be5a000)
    libxcb-sync.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-sync.so.1 (0x00007f6d1bc53000)
    libxshmfence.so.1 => /usr/lib/x86_64-linux-gnu/libxshmfence.so.1 (0x00007f6d1ba4f000)
    libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007f6d1b821000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f6d1b60f000)
    libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f6d1b40b000)
    libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f6d1b205000)
    libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007f6d1b003000)
    libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007f6d1ade9000)
    libxcb-dri2.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0 (0x00007f6d1abe4000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f6d1a9c2000)
    libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f6d1a7bb000)
    libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007f6d1a5ac000)
    libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f6d1a3a1000)
    libidn.so.11 => /usr/lib/x86_64-linux-gnu/libidn.so.11 (0x00007f6d1a16e000)
    librtmp.so.1 => /usr/lib/x86_64-linux-gnu/librtmp.so.1 (0x00007f6d19f52000)
    libnettle.so.6 => /usr/lib/x86_64-linux-gnu/libnettle.so.6 (0x00007f6d19d1b000)
    libgnutls.so.30 => /usr/lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007f6d199eb000)
    libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f6d197a1000)
    liblber-2.4.so.2 => /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007f6d19591000)
    libldap_r-2.4.so.2 => /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 (0x00007f6d19340000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f6d19126000)
    libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f6d18e7b000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f6d18c77000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f6d18a70000)
    libhogweed.so.4 => /usr/lib/x86_64-linux-gnu/libhogweed.so.4 (0x00007f6d1883d000)
    libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f6d185bd000)
    libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f6d18357000)
    libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f6d18144000)
    libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f6d17e71000)
    libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f6d17c42000)
    libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f6d17a3e000)
    libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f6d17833000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f6d17617000)
    libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007f6d173fc000)
    libgssapi.so.3 => /usr/lib/x86_64-linux-gnu/libgssapi.so.3 (0x00007f6d171bb000)
    libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f6d16f95000)
    libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f6d16d8d000)
    libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f6d16b88000)
    libheimntlm.so.0 => /usr/lib/x86_64-linux-gnu/libheimntlm.so.0 (0x00007f6d1697f000)
    libkrb5.so.26 => /usr/lib/x86_64-linux-gnu/libkrb5.so.26 (0x00007f6d166f4000)
    libasn1.so.8 => /usr/lib/x86_64-linux-gnu/libasn1.so.8 (0x00007f6d16452000)
    libhcrypto.so.4 => /usr/lib/x86_64-linux-gnu/libhcrypto.so.4 (0x00007f6d1621f000)
    libroken.so.18 => /usr/lib/x86_64-linux-gnu/libroken.so.18 (0x00007f6d16008000)
    libwind.so.0 => /usr/lib/x86_64-linux-gnu/libwind.so.0 (0x00007f6d15ddf000)
    libheimbase.so.1 => /usr/lib/x86_64-linux-gnu/libheimbase.so.1 (0x00007f6d15bcf000)
    libhx509.so.5 => /usr/lib/x86_64-linux-gnu/libhx509.so.5 (0x00007f6d15984000)
    libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007f6d156af000)
    libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f6d15476000)

Thanks!

Rassi

não lida,
19 de jan. de 2017, 22:35:1719/01/2017
para mongodb-user
Hmm, I don't see anything wrong with the link line yet.  Could you post an attachment containing the output of running the following commands, after you compile main.cpp with line 55 uncommented?

- nm --demangle --defined-only /usr/local/lib/libbsoncxx.a
- nm --demangle --undefined-only CMakeFiles/mongo_test.dir/main.cpp.o
- cat /usr/local/include/bsoncxx/v_noabi/bsoncxx/config/version.hpp

I also notice a couple of issues with your example code, that could possibly explain the exception you're encountering:
- It's missing the required driver initialization logic (you need to create a mongocxx::instance object before using the driver, see https://github.com/mongodb/mongo-cxx-driver/blob/r3.1.1/examples/mongocxx/connect.cpp#L51 for an example of how to do this).
- In your example code, "client" goes out of scope at the end of the "try" block, but "db" doesn't go out of scope until the end of the function.  Logically, mongocxx::client objects own all mongocxx::database objects created from them, and it's a programming error to let the "db" object outlive the "client" object.

~ rassi

Blake McConnell

não lida,
23 de jan. de 2017, 13:14:3923/01/2017
para mongodb-user
Thanks for pointing out the logical errors, Rassi.  I fixed them, however I still get the same linker/runtime errors. 

Here's the output you requested:


- nm --demangle --defined-only /usr/local/lib/libbsoncxx.a:

element.cpp.o:
0000000000000010 T bsoncxx::v_noabi::array::element::element(unsigned char const*, unsigned int, unsigned int)
0000000000000000 T bsoncxx::v_noabi::array::element::element()
0000000000000010 T bsoncxx::v_noabi::array::element::element(unsigned char const*, unsigned int, unsigned int)
0000000000000000 T bsoncxx::v_noabi::array::element::element()

value.cpp.o:
0000000000000000 t bsoncxx::v_noabi::array::(anonymous namespace)::uint8_t_deleter(unsigned char*)
0000000000000280 T bsoncxx::v_noabi::array::value::release()
00000000000001b0 T bsoncxx::v_noabi::array::value::operator=(bsoncxx::v_noabi::array::value const&)
0000000000000050 T bsoncxx::v_noabi::array::value::value(bsoncxx::v_noabi::array::view)
0000000000000020 T bsoncxx::v_noabi::array::value::value(unsigned char*, unsigned long, void (*)(unsigned char*))
00000000000000f0 T bsoncxx::v_noabi::array::value::value(bsoncxx::v_noabi::array::value const&)
0000000000000030 T bsoncxx::v_noabi::array::value::value(std::unique_ptr<unsigned char [], void (*)(unsigned char*)>, unsigned long)
0000000000000050 T bsoncxx::v_noabi::array::value::value(bsoncxx::v_noabi::array::view)
0000000000000020 T bsoncxx::v_noabi::array::value::value(unsigned char*, unsigned long, void (*)(unsigned char*))
00000000000000f0 T bsoncxx::v_noabi::array::value::value(bsoncxx::v_noabi::array::value const&)
0000000000000030 T bsoncxx::v_noabi::array::value::value(std::unique_ptr<unsigned char [], void (*)(unsigned char*)>, unsigned long)

view.cpp.o:
0000000000000010 T bsoncxx::v_noabi::array::view::const_iterator::const_iterator(bsoncxx::v_noabi::array::element const&)
0000000000000000 T bsoncxx::v_noabi::array::view::const_iterator::const_iterator()
0000000000000010 T bsoncxx::v_noabi::array::view::const_iterator::const_iterator(bsoncxx::v_noabi::array::element const&)
0000000000000000 T bsoncxx::v_noabi::array::view::const_iterator::const_iterator()
0000000000000020 T bsoncxx::v_noabi::array::view::const_iterator::operator*()
0000000000000160 T bsoncxx::v_noabi::array::view::const_iterator::operator++(int)
0000000000000040 T bsoncxx::v_noabi::array::view::const_iterator::operator++()
0000000000000030 T bsoncxx::v_noabi::array::view::const_iterator::operator->()
0000000000000620 T bsoncxx::v_noabi::array::view::view(unsigned char const*, unsigned long)
0000000000000630 T bsoncxx::v_noabi::array::view::view()
0000000000000620 T bsoncxx::v_noabi::array::view::view(unsigned char const*, unsigned long)
0000000000000630 T bsoncxx::v_noabi::array::view::view()
0000000000000680 T bsoncxx::v_noabi::array::operator==(bsoncxx::v_noabi::array::view, bsoncxx::v_noabi::array::view)
00000000000002a0 T bsoncxx::v_noabi::array::operator==(bsoncxx::v_noabi::array::view::const_iterator const&, bsoncxx::v_noabi::array::view::const_iterator const&)
0000000000000700 T bsoncxx::v_noabi::array::operator!=(bsoncxx::v_noabi::array::view, bsoncxx::v_noabi::array::view)
0000000000000300 T bsoncxx::v_noabi::array::operator!=(bsoncxx::v_noabi::array::view::const_iterator const&, bsoncxx::v_noabi::array::view::const_iterator const&)
00000000000004a0 T bsoncxx::v_noabi::array::view::end() const
0000000000000450 T bsoncxx::v_noabi::array::view::cend() const
0000000000000640 T bsoncxx::v_noabi::array::view::data() const
00000000000004f0 T bsoncxx::v_noabi::array::view::find(unsigned int) const
0000000000000490 T bsoncxx::v_noabi::array::view::begin() const
0000000000000660 T bsoncxx::v_noabi::array::view::empty() const
0000000000000360 T bsoncxx::v_noabi::array::view::cbegin() const
0000000000000650 T bsoncxx::v_noabi::array::view::length() const
0000000000000670 T bsoncxx::v_noabi::array::view::operator bsoncxx::v_noabi::document::view() const
0000000000000610 T bsoncxx::v_noabi::array::view::operator[](unsigned int) const

core.cpp.o:
0000000000000000 W bsoncxx::v_noabi::stack<bsoncxx::v_noabi::builder::core::impl::frame, 4ul>::~stack()
0000000000000000 W bsoncxx::v_noabi::stack<bsoncxx::v_noabi::builder::core::impl::frame, 4ul>::~stack()
0000000000000000 n bsoncxx::v_noabi::stack<bsoncxx::v_noabi::builder::core::impl::frame, 4ul>::~stack()
0000000000000000 t bsoncxx::v_noabi::builder::(anonymous namespace)::bson_free_deleter(unsigned char*)
0000000000004ab0 T bsoncxx::v_noabi::builder::core::open_array()
0000000000006110 T bsoncxx::v_noabi::builder::core::close_array()
0000000000004e50 T bsoncxx::v_noabi::builder::core::concatenate(bsoncxx::v_noabi::document::view const&)
00000000000065c0 T bsoncxx::v_noabi::builder::core::extract_array()
0000000000004710 T bsoncxx::v_noabi::builder::core::open_document()
0000000000005f20 T bsoncxx::v_noabi::builder::core::close_document()
00000000000063d0 T bsoncxx::v_noabi::builder::core::extract_document()
00000000000066e0 T bsoncxx::v_noabi::builder::core::clear()
0000000000004560 T bsoncxx::v_noabi::builder::core::append(bool)
00000000000037b0 T bsoncxx::v_noabi::builder::core::append(double)
0000000000003970 T bsoncxx::v_noabi::builder::core::append(int)
00000000000043b0 T bsoncxx::v_noabi::builder::core::append(long)
00000000000035f0 T bsoncxx::v_noabi::builder::core::append(core::v1::basic_string_view<char, std::char_traits<char> >)
0000000000003d30 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::decimal128)
0000000000004170 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::array::view)
0000000000003f30 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::document::view)
0000000000003430 T bsoncxx::v_noabi::builder::core::append(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)
0000000000003b20 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::oid const&)
0000000000000bb0 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_document const&)
0000000000001e90 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_dbpointer const&)
0000000000002b70 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_timestamp const&)
00000000000011f0 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_undefined const&)
0000000000002630 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_codewscope const&)
0000000000002ee0 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_decimal128 const&)
00000000000013a0 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_oid const&)
0000000000005130 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::value const&)
00000000000015a0 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_bool const&)
0000000000002190 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_code const&)
0000000000001760 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_date const&)
0000000000001910 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_null const&)
00000000000009f0 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_utf8 const&)
0000000000000df0 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_array const&)
00000000000029c0 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_int32 const&)
0000000000002d30 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_int64 const&)
0000000000001ac0 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_regex const&)
0000000000001030 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_binary const&)
0000000000000840 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_double const&)
0000000000003280 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_maxkey const&)
00000000000030d0 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_minkey const&)
0000000000002470 T bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_symbol const&)
00000000000005d0 T bsoncxx::v_noabi::builder::core::key_view(core::v1::basic_string_view<char, std::char_traits<char> >)
00000000000006a0 T bsoncxx::v_noabi::builder::core::key_owned(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)
0000000000000020 T bsoncxx::v_noabi::builder::core::operator=(bsoncxx::v_noabi::builder::core&&)
0000000000006830 T bsoncxx::v_noabi::builder::core::core(bool)
0000000000000010 T bsoncxx::v_noabi::builder::core::core(bsoncxx::v_noabi::builder::core&&)
0000000000006830 T bsoncxx::v_noabi::builder::core::core(bool)
0000000000000010 T bsoncxx::v_noabi::builder::core::core(bsoncxx::v_noabi::builder::core&&)
0000000000000300 T bsoncxx::v_noabi::builder::core::~core()
0000000000000300 T bsoncxx::v_noabi::builder::core::~core()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 n bsoncxx::v_noabi::exception::~exception()
00000000000064f0 T bsoncxx::v_noabi::builder::core::view_array() const
0000000000006300 T bsoncxx::v_noabi::builder::core::view_document() const
0000000000000000 W std::system_error::system_error(std::error_code)
0000000000000000 W std::system_error::system_error(std::error_code)
0000000000000000 n std::system_error::system_error(std::error_code)
0000000000000000 V typeinfo for bsoncxx::v_noabi::exception
0000000000000000 V typeinfo name for bsoncxx::v_noabi::exception
0000000000000000 V vtable for bsoncxx::v_noabi::exception

decimal128.cpp.o:
0000000000000000 T bsoncxx::v_noabi::decimal128::decimal128(core::v1::basic_string_view<char, std::char_traits<char> >)
0000000000000000 T bsoncxx::v_noabi::decimal128::decimal128(core::v1::basic_string_view<char, std::char_traits<char> >)
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 n bsoncxx::v_noabi::exception::~exception()
0000000000000310 T bsoncxx::v_noabi::operator==(bsoncxx::v_noabi::decimal128 const&, bsoncxx::v_noabi::decimal128 const&)
0000000000000330 T bsoncxx::v_noabi::operator!=(bsoncxx::v_noabi::decimal128 const&, bsoncxx::v_noabi::decimal128 const&)
0000000000000200 T bsoncxx::v_noabi::decimal128::to_string[abi:cxx11]() const
0000000000000000 V typeinfo for bsoncxx::v_noabi::exception
0000000000000000 V typeinfo name for bsoncxx::v_noabi::exception
0000000000000000 V vtable for bsoncxx::v_noabi::exception

element.cpp.o:
0000000000000040 T bsoncxx::v_noabi::document::element::raw(unsigned char const*)
0000000000000060 T bsoncxx::v_noabi::document::element::length(unsigned int)
0000000000000080 T bsoncxx::v_noabi::document::element::offset(unsigned int)
0000000000000020 T bsoncxx::v_noabi::document::element::element(unsigned char const*, unsigned int, unsigned int)
0000000000000000 T bsoncxx::v_noabi::document::element::element()
0000000000000020 T bsoncxx::v_noabi::document::element::element(unsigned char const*, unsigned int, unsigned int)
0000000000000000 T bsoncxx::v_noabi::document::element::element()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 n bsoncxx::v_noabi::exception::~exception()
0000000000000270 T bsoncxx::v_noabi::document::element::get_binary() const
0000000000000550 T bsoncxx::v_noabi::document::element::get_double() const
0000000000001af0 T bsoncxx::v_noabi::document::element::get_maxkey() const
00000000000019e0 T bsoncxx::v_noabi::document::element::get_minkey() const
0000000000001570 T bsoncxx::v_noabi::document::element::get_symbol() const
0000000000001c00 T bsoncxx::v_noabi::document::element::get_document() const
0000000000001260 T bsoncxx::v_noabi::document::element::get_dbpointer() const
0000000000001870 T bsoncxx::v_noabi::document::element::get_timestamp() const
0000000000000940 T bsoncxx::v_noabi::document::element::get_undefined() const
00000000000016d0 T bsoncxx::v_noabi::document::element::get_codewscope() const
0000000000000bc0 T bsoncxx::v_noabi::document::element::get_decimal128() const
0000000000000170 T bsoncxx::v_noabi::document::element::key() const
0000000000000030 T bsoncxx::v_noabi::document::element::raw() const
0000000000000090 T bsoncxx::v_noabi::document::element::type() const
0000000000000050 T bsoncxx::v_noabi::document::element::length() const
0000000000000070 T bsoncxx::v_noabi::document::element::offset() const
0000000000000a50 T bsoncxx::v_noabi::document::element::get_oid() const
0000000000000d20 T bsoncxx::v_noabi::document::element::get_bool() const
0000000000001410 T bsoncxx::v_noabi::document::element::get_code() const
0000000000000e70 T bsoncxx::v_noabi::document::element::get_date() const
0000000000000fc0 T bsoncxx::v_noabi::document::element::get_null() const
00000000000003f0 T bsoncxx::v_noabi::document::element::get_utf8() const
0000000000001d80 T bsoncxx::v_noabi::document::element::get_array() const
00000000000006a0 T bsoncxx::v_noabi::document::element::get_int32() const
00000000000007f0 T bsoncxx::v_noabi::document::element::get_int64() const
00000000000010d0 T bsoncxx::v_noabi::document::element::get_regex() const
0000000000001f00 T bsoncxx::v_noabi::document::element::get_value() const
00000000000029a0 T bsoncxx::v_noabi::document::element::operator bool() const
00000000000027a0 T bsoncxx::v_noabi::document::element::operator[](unsigned int) const
0000000000002590 T bsoncxx::v_noabi::document::element::operator[](core::v1::basic_string_view<char, std::char_traits<char> >) const
0000000000000000 W std::system_error::system_error(std::error_code)
0000000000000000 W std::system_error::system_error(std::error_code)
0000000000000000 n std::system_error::system_error(std::error_code)
0000000000000000 V typeinfo for bsoncxx::v_noabi::exception
0000000000000000 V typeinfo name for bsoncxx::v_noabi::exception
0000000000000000 V vtable for bsoncxx::v_noabi::exception

value.cpp.o:
0000000000000000 t bsoncxx::v_noabi::document::(anonymous namespace)::uint8_t_deleter(unsigned char*)
0000000000000280 T bsoncxx::v_noabi::document::value::release()
00000000000001b0 T bsoncxx::v_noabi::document::value::operator=(bsoncxx::v_noabi::document::value const&)
0000000000000050 T bsoncxx::v_noabi::document::value::value(bsoncxx::v_noabi::document::view)
0000000000000020 T bsoncxx::v_noabi::document::value::value(unsigned char*, unsigned long, void (*)(unsigned char*))
00000000000000f0 T bsoncxx::v_noabi::document::value::value(bsoncxx::v_noabi::document::value const&)
0000000000000030 T bsoncxx::v_noabi::document::value::value(std::unique_ptr<unsigned char [], void (*)(unsigned char*)>, unsigned long)
0000000000000050 T bsoncxx::v_noabi::document::value::value(bsoncxx::v_noabi::document::view)
0000000000000020 T bsoncxx::v_noabi::document::value::value(unsigned char*, unsigned long, void (*)(unsigned char*))
00000000000000f0 T bsoncxx::v_noabi::document::value::value(bsoncxx::v_noabi::document::value const&)
0000000000000030 T bsoncxx::v_noabi::document::value::value(std::unique_ptr<unsigned char [], void (*)(unsigned char*)>, unsigned long)

view.cpp.o:
0000000000000000 r bsoncxx::v_noabi::document::(anonymous namespace)::k_default_view
0000000000000010 T bsoncxx::v_noabi::document::view::const_iterator::const_iterator(bsoncxx::v_noabi::document::element const&)
0000000000000000 T bsoncxx::v_noabi::document::view::const_iterator::const_iterator()
0000000000000010 T bsoncxx::v_noabi::document::view::const_iterator::const_iterator(bsoncxx::v_noabi::document::element const&)
0000000000000000 T bsoncxx::v_noabi::document::view::const_iterator::const_iterator()
0000000000000020 T bsoncxx::v_noabi::document::view::const_iterator::operator*()
0000000000000160 T bsoncxx::v_noabi::document::view::const_iterator::operator++(int)
0000000000000040 T bsoncxx::v_noabi::document::view::const_iterator::operator++()
0000000000000030 T bsoncxx::v_noabi::document::view::const_iterator::operator->()
0000000000000750 T bsoncxx::v_noabi::document::view::view(unsigned char const*, unsigned long)
0000000000000760 T bsoncxx::v_noabi::document::view::view()
0000000000000750 T bsoncxx::v_noabi::document::view::view(unsigned char const*, unsigned long)
0000000000000760 T bsoncxx::v_noabi::document::view::view()
00000000000007a0 T bsoncxx::v_noabi::document::operator==(bsoncxx::v_noabi::document::view, bsoncxx::v_noabi::document::view)
00000000000002a0 T bsoncxx::v_noabi::document::operator==(bsoncxx::v_noabi::document::view::const_iterator const&, bsoncxx::v_noabi::document::view::const_iterator const&)
00000000000007d0 T bsoncxx::v_noabi::document::operator!=(bsoncxx::v_noabi::document::view, bsoncxx::v_noabi::document::view)
0000000000000300 T bsoncxx::v_noabi::document::operator!=(bsoncxx::v_noabi::document::view::const_iterator const&, bsoncxx::v_noabi::document::view::const_iterator const&)
0000000000000490 T bsoncxx::v_noabi::document::view::end() const
0000000000000440 T bsoncxx::v_noabi::document::view::cend() const
0000000000000770 T bsoncxx::v_noabi::document::view::data() const
00000000000004e0 T bsoncxx::v_noabi::document::view::find(core::v1::basic_string_view<char, std::char_traits<char> >) const
0000000000000480 T bsoncxx::v_noabi::document::view::begin() const
0000000000000790 T bsoncxx::v_noabi::document::view::empty() const
0000000000000360 T bsoncxx::v_noabi::document::view::cbegin() const
0000000000000780 T bsoncxx::v_noabi::document::view::length() const
0000000000000700 T bsoncxx::v_noabi::document::view::operator[](core::v1::basic_string_view<char, std::char_traits<char> >) const

error_code.cpp.o:
0000000000000000 b guard variable for bsoncxx::v_noabi::error_category()::instance
0000000000000020 t bsoncxx::v_noabi::(anonymous namespace)::error_category_impl::~error_category_impl()
0000000000000010 t bsoncxx::v_noabi::(anonymous namespace)::error_category_impl::~error_category_impl()
0000000000000010 t bsoncxx::v_noabi::(anonymous namespace)::error_category_impl::~error_category_impl()
00000000000010b0 T bsoncxx::v_noabi::error_category()
0000000000000000 t bsoncxx::v_noabi::(anonymous namespace)::error_category_impl::name() const
0000000000000040 t bsoncxx::v_noabi::(anonymous namespace)::error_category_impl::message(int) const
0000000000000128 r typeinfo for bsoncxx::v_noabi::(anonymous namespace)::error_category_impl
0000000000000140 r typeinfo name for bsoncxx::v_noabi::(anonymous namespace)::error_category_impl
0000000000000178 r vtable for bsoncxx::v_noabi::(anonymous namespace)::error_category_impl
0000000000000000 d bsoncxx::v_noabi::error_category()::instance

json.cpp.o:
0000000000000000 t _GLOBAL__sub_I__ZN7bsoncxx7v_noabi7to_jsonB5cxx11ENS0_8document4viewE
0000000000000000 t bsoncxx::v_noabi::(anonymous namespace)::bson_free_deleter(unsigned char*)
0000000000000010 T bsoncxx::v_noabi::to_json[abi:cxx11](bsoncxx::v_noabi::document::view)
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 n bsoncxx::v_noabi::exception::~exception()
0000000000000220 T bsoncxx::v_noabi::from_json(core::v1::basic_string_view<char, std::char_traits<char> >)
0000000000000000 W std::system_error::system_error(std::error_code, char const*)
0000000000000000 W std::system_error::system_error(std::error_code, char const*)
0000000000000000 n std::system_error::system_error(std::error_code, char const*)
0000000000000000 b std::__ioinit
0000000000000000 V typeinfo for bsoncxx::v_noabi::exception
0000000000000000 V typeinfo name for bsoncxx::v_noabi::exception
0000000000000000 V vtable for bsoncxx::v_noabi::exception

oid.cpp.o:
0000000000000340 T bsoncxx::v_noabi::oid_compare(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)
0000000000000000 R bsoncxx::v_noabi::oid::init_tag
0000000000000050 T bsoncxx::v_noabi::oid::oid(bsoncxx::v_noabi::oid::init_tag_t)
0000000000000150 T bsoncxx::v_noabi::oid::oid(char const*, unsigned long)
00000000000000a0 T bsoncxx::v_noabi::oid::oid(core::v1::basic_string_view<char, std::char_traits<char> > const&)
0000000000000000 T bsoncxx::v_noabi::oid::oid()
0000000000000050 T bsoncxx::v_noabi::oid::oid(bsoncxx::v_noabi::oid::init_tag_t)
0000000000000150 T bsoncxx::v_noabi::oid::oid(char const*, unsigned long)
00000000000000a0 T bsoncxx::v_noabi::oid::oid(core::v1::basic_string_view<char, std::char_traits<char> > const&)
0000000000000000 T bsoncxx::v_noabi::oid::oid()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 W bsoncxx::v_noabi::exception::~exception()
0000000000000000 n bsoncxx::v_noabi::exception::~exception()
0000000000000520 T bsoncxx::v_noabi::operator==(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)
00000000000004c0 T bsoncxx::v_noabi::operator>=(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)
0000000000000400 T bsoncxx::v_noabi::operator>(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)
0000000000000460 T bsoncxx::v_noabi::operator<=(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)
00000000000003a0 T bsoncxx::v_noabi::operator<(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)
0000000000000580 T bsoncxx::v_noabi::operator!=(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)
00000000000002e0 T bsoncxx::v_noabi::oid::get_time_t() const
0000000000000330 T bsoncxx::v_noabi::oid::bytes() const
00000000000001c0 T bsoncxx::v_noabi::oid::to_string[abi:cxx11]() const
00000000000002d0 T bsoncxx::v_noabi::oid::operator bool() const
0000000000000000 W std::system_error::system_error(std::error_code)
0000000000000000 W std::system_error::system_error(std::error_code)
0000000000000000 n std::system_error::system_error(std::error_code)
0000000000000000 V typeinfo for bsoncxx::v_noabi::exception
0000000000000000 V typeinfo name for bsoncxx::v_noabi::exception
0000000000000000 V vtable for bsoncxx::v_noabi::exception

itoa.cpp.o:
00000000000000c0 T bsoncxx::v_noabi::itoa::init()
0000000000000330 T bsoncxx::v_noabi::itoa::operator=(unsigned int)
0000000000000260 T bsoncxx::v_noabi::itoa::operator=(bsoncxx::v_noabi::itoa const&)
0000000000000000 T bsoncxx::v_noabi::itoa::itoa(unsigned int)
00000000000001a0 T bsoncxx::v_noabi::itoa::itoa(bsoncxx::v_noabi::itoa const&)
0000000000000180 T bsoncxx::v_noabi::itoa::itoa()
0000000000000000 T bsoncxx::v_noabi::itoa::itoa(unsigned int)
00000000000001a0 T bsoncxx::v_noabi::itoa::itoa(bsoncxx::v_noabi::itoa const&)
0000000000000180 T bsoncxx::v_noabi::itoa::itoa()
0000000000000400 T bsoncxx::v_noabi::itoa::c_str() const
0000000000000410 T bsoncxx::v_noabi::itoa::length() const

view_or_value.cpp.o:
0000000000000000 T bsoncxx::v_noabi::string::view_or_value::terminated() const
0000000000000160 T bsoncxx::v_noabi::string::view_or_value::data() const

types.cpp.o:
0000000000000012 R bsoncxx::v_noabi::types::b_document::type_id
0000000000000009 R bsoncxx::v_noabi::types::b_dbpointer::type_id
0000000000000004 R bsoncxx::v_noabi::types::b_timestamp::type_id
000000000000000f R bsoncxx::v_noabi::types::b_undefined::type_id
0000000000000006 R bsoncxx::v_noabi::types::b_codewscope::type_id
0000000000000002 R bsoncxx::v_noabi::types::b_decimal128::type_id
000000000000000e R bsoncxx::v_noabi::types::b_oid::type_id
000000000000000d R bsoncxx::v_noabi::types::b_bool::type_id
0000000000000008 R bsoncxx::v_noabi::types::b_code::type_id
000000000000000c R bsoncxx::v_noabi::types::b_date::type_id
000000000000000b R bsoncxx::v_noabi::types::b_null::type_id
0000000000000013 R bsoncxx::v_noabi::types::b_utf8::type_id
0000000000000011 R bsoncxx::v_noabi::types::b_array::type_id
0000000000000005 R bsoncxx::v_noabi::types::b_int32::type_id
0000000000000003 R bsoncxx::v_noabi::types::b_int64::type_id
000000000000000a R bsoncxx::v_noabi::types::b_regex::type_id
0000000000000010 R bsoncxx::v_noabi::types::b_binary::type_id
0000000000000014 R bsoncxx::v_noabi::types::b_double::type_id
0000000000000001 R bsoncxx::v_noabi::types::b_maxkey::type_id
0000000000000000 R bsoncxx::v_noabi::types::b_minkey::type_id
0000000000000007 R bsoncxx::v_noabi::types::b_symbol::type_id
0000000000000440 T bsoncxx::v_noabi::to_string[abi:cxx11](bsoncxx::v_noabi::binary_sub_type)
0000000000000000 T bsoncxx::v_noabi::to_string[abi:cxx11](bsoncxx::v_noabi::type)

value.cpp.o:
0000000000000d30 T bsoncxx::v_noabi::types::value::destroy()
0000000000000350 T bsoncxx::v_noabi::types::value::operator=(bsoncxx::v_noabi::types::value const&)
0000000000000030 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_document)
00000000000000e0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_dbpointer)
0000000000000190 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_timestamp)
0000000000000060 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_undefined)
0000000000000150 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_codewscope)
00000000000001b0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_decimal128)
0000000000000070 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_oid)
0000000000000080 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_bool)
0000000000000110 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_code)
0000000000000090 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_date)
00000000000000a0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_null)
0000000000000010 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_utf8)
0000000000000040 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_array)
0000000000000180 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_int32)
00000000000001a0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_int64)
00000000000000b0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_regex)
0000000000000050 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_binary)
0000000000000000 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_double)
00000000000001c0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_maxkey)
00000000000001d0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_minkey)
0000000000000130 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_symbol)
00000000000001e0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::value const&)
0000000000000030 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_document)
00000000000000e0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_dbpointer)
0000000000000190 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_timestamp)
0000000000000060 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_undefined)
0000000000000150 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_codewscope)
00000000000001b0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_decimal128)
0000000000000070 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_oid)
0000000000000080 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_bool)
0000000000000110 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_code)
0000000000000090 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_date)
00000000000000a0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_null)
0000000000000010 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_utf8)
0000000000000040 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_array)
0000000000000180 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_int32)
00000000000001a0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_int64)
00000000000000b0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_regex)
0000000000000050 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_binary)
0000000000000000 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_double)
00000000000001c0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_maxkey)
00000000000001d0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_minkey)
0000000000000130 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::b_symbol)
00000000000001e0 T bsoncxx::v_noabi::types::value::value(bsoncxx::v_noabi::types::value const&)
00000000000004e0 T bsoncxx::v_noabi::types::value::~value()
00000000000004e0 T bsoncxx::v_noabi::types::value::~value()
0000000000000650 T bsoncxx::v_noabi::types::operator==(bsoncxx::v_noabi::types::value const&, bsoncxx::v_noabi::types::value const&)
00000000000009c0 T bsoncxx::v_noabi::types::operator!=(bsoncxx::v_noabi::types::value const&, bsoncxx::v_noabi::types::value const&)
0000000000000540 T bsoncxx::v_noabi::types::value::get_binary() const
0000000000000500 T bsoncxx::v_noabi::types::value::get_double() const
0000000000000630 T bsoncxx::v_noabi::types::value::get_maxkey() const
0000000000000640 T bsoncxx::v_noabi::types::value::get_minkey() const
00000000000005d0 T bsoncxx::v_noabi::types::value::get_symbol() const
0000000000000520 T bsoncxx::v_noabi::types::value::get_document() const
00000000000005b0 T bsoncxx::v_noabi::types::value::get_dbpointer() const
0000000000000600 T bsoncxx::v_noabi::types::value::get_timestamp() const
0000000000000550 T bsoncxx::v_noabi::types::value::get_undefined() const
00000000000005e0 T bsoncxx::v_noabi::types::value::get_codewscope() const
0000000000000620 T bsoncxx::v_noabi::types::value::get_decimal128() const
00000000000004f0 T bsoncxx::v_noabi::types::value::type() const
0000000000000560 T bsoncxx::v_noabi::types::value::get_oid() const
0000000000000570 T bsoncxx::v_noabi::types::value::get_bool() const
00000000000005c0 T bsoncxx::v_noabi::types::value::get_code() const
0000000000000580 T bsoncxx::v_noabi::types::value::get_date() const
0000000000000590 T bsoncxx::v_noabi::types::value::get_null() const
0000000000000510 T bsoncxx::v_noabi::types::value::get_utf8() const
0000000000000530 T bsoncxx::v_noabi::types::value::get_array() const
00000000000005f0 T bsoncxx::v_noabi::types::value::get_int32() const
0000000000000610 T bsoncxx::v_noabi::types::value::get_int64() const
00000000000005a0 T bsoncxx::v_noabi::types::value::get_regex() const

validate.cpp.o:
00000000000000d0 T bsoncxx::v_noabi::validate(unsigned char const*, unsigned long)
00000000000001e0 T bsoncxx::v_noabi::validate(unsigned char const*, unsigned long, bsoncxx::v_noabi::validator const&, unsigned long*)
0000000000000050 T bsoncxx::v_noabi::validator::check_utf8(bool)
00000000000000b0 T bsoncxx::v_noabi::validator::check_dot_keys(bool)
0000000000000090 T bsoncxx::v_noabi::validator::check_dollar_keys(bool)
0000000000000070 T bsoncxx::v_noabi::validator::check_utf8_allow_null(bool)
0000000000000000 T bsoncxx::v_noabi::validator::validator()
0000000000000000 T bsoncxx::v_noabi::validator::validator()
0000000000000030 T bsoncxx::v_noabi::validator::~validator()
0000000000000030 T bsoncxx::v_noabi::validator::~validator()
0000000000000060 T bsoncxx::v_noabi::validator::check_utf8() const
00000000000000c0 T bsoncxx::v_noabi::validator::check_dot_keys() const
00000000000000a0 T bsoncxx::v_noabi::validator::check_dollar_keys() const
0000000000000080 T bsoncxx::v_noabi::validator::check_utf8_allow_null() const

- nm --demangle --undefined-only CMakeFiles/mongo_test.dir/
main.cpp.o

U __cxa_atexit
                 U __cxa_begin_catch
                 U __cxa_call_unexpected
                 U __cxa_end_catch
                 U __cxa_pure_virtual
                 U __cxa_rethrow
                 U __dso_handle
                 U gethostname
                 U __gxx_personality_v0
                 w __pthread_key_create
                 U __stack_chk_fail
                 U _Unwind_Resume
                 U operator delete(void*)
                 U boost::system::system_category()
                 U boost::system::generic_category()
                 U cinder::app::RendererGl::RendererGl(cinder::app::RendererGl::Options const&)
                 U cinder::app::Window::setFullScreen(bool, cinder::app::FullScreenOptions const&)
                 U cinder::app::AppBase::initialize(cinder::app::AppBase::Settings*, std::shared_ptr<cinder::app::Renderer> const&, char const*, int, char* const*)
                 U cinder::app::AppBase::cleanupLaunch()
                 U cinder::app::AppBase::executeLaunch()
                 U cinder::app::AppBase::prepareLaunch()
                 U cinder::app::AppBase::privateSetup__()
                 U cinder::app::AppBase::privateUpdate__()
                 U cinder::app::AppBase::restoreWindowContext()
                 U cinder::app::AppBase::Settings::Settings()
                 U cinder::app::AppLinux::hideCursor()
                 U cinder::app::AppLinux::showCursor()
                 U cinder::app::AppLinux::createWindow(cinder::app::Window::Format const&)
                 U cinder::app::AppLinux::setFrameRate(float)
                 U cinder::app::AppLinux::disableFrameRate()
                 U cinder::app::AppLinux::quit()
                 U cinder::app::AppLinux::launch()
                 U cinder::app::AppLinux::AppLinux()
                 U cinder::app::AppLinux::~AppLinux()
                 U bsoncxx::v_noabi::types::value::~value()
                 U bsoncxx::v_noabi::builder::core::open_document()
                 U bsoncxx::v_noabi::builder::core::close_document()
                 U bsoncxx::v_noabi::builder::core::extract_document()
                 U bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_utf8 const&)
                 U bsoncxx::v_noabi::builder::core::key_view(core::v1::basic_string_view<char, std::char_traits<char> >)
                 U bsoncxx::v_noabi::builder::core::core(bool)
                 U bsoncxx::v_noabi::builder::core::~core()
                 U bsoncxx::v_noabi::document::view::view(unsigned char const*, unsigned long)
                 U mongocxx::v_noabi::collection::insert_one(bsoncxx::v_noabi::view_or_value<bsoncxx::v_noabi::document::view, bsoncxx::v_noabi::document::value>, mongocxx::v_noabi::options::insert const&)
                 U mongocxx::v_noabi::collection::~collection()
                 U mongocxx::v_noabi::write_concern::~write_concern()
                 U mongocxx::v_noabi::uri::uri(bsoncxx::v_noabi::string::view_or_value)
                 U mongocxx::v_noabi::uri::~uri()
                 U mongocxx::v_noabi::client::operator=(mongocxx::v_noabi::client&&)
                 U mongocxx::v_noabi::client::client(mongocxx::v_noabi::uri const&, mongocxx::v_noabi::options::client const&)
                 U mongocxx::v_noabi::client::client()
                 U mongocxx::v_noabi::client::~client()
                 U mongocxx::v_noabi::logger::logger()
                 U mongocxx::v_noabi::logger::~logger()
                 U mongocxx::v_noabi::database::operator=(mongocxx::v_noabi::database&&)
                 U mongocxx::v_noabi::database::database()
                 U mongocxx::v_noabi::database::~database()
                 U mongocxx::v_noabi::instance::instance(std::unique_ptr<mongocxx::v_noabi::logger, std::default_delete<mongocxx::v_noabi::logger> >)
                 U mongocxx::v_noabi::instance::~instance()
                 U mongocxx::v_noabi::to_string(mongocxx::v_noabi::log_level)
                 U cinder::app::Window::isFullScreen() const
                 U cinder::app::Window::setPos(glm::tvec2<int, (glm::precision)0> const&) const
                 U cinder::app::AppLinux::getMousePos() const
                 U cinder::app::AppLinux::getFrameRate() const
                 U cinder::app::AppLinux::getNumWindows() const
                 U cinder::app::AppLinux::getWindowIndex(unsigned long) const
                 U cinder::app::AppLinux::isFrameRateEnabled() const
                 U cinder::app::AppLinux::getForegroundWindow() const
                 U cinder::app::AppLinux::getWindow() const
                 U mongocxx::v_noabi::database::collection(bsoncxx::v_noabi::string::view_or_value) const
                 U mongocxx::v_noabi::client::database(bsoncxx::v_noabi::string::view_or_value) const &
                 U std::string::data() const
                 U std::string::size() const
                 U std::string::c_str() const
                 U std::string::empty() const
                 U std::runtime_error::what() const
                 U std::allocator<char>::allocator()
                 U std::allocator<char>::~allocator()
                 U std::string::operator=(char const*)
                 U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned long, std::allocator<char> const&)
                 U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
                 U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)
                 U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
                 U std::string::operator+=(char const*)
                 U std::string::operator+=(std::string const&)
                 U std::runtime_error::~runtime_error()
                 U std::ios_base::Init::Init()
                 U std::ios_base::Init::~Init()
                 U operator new(unsigned long)
                 U std::__throw_bad_function_call()
                 U std::cout
                 U std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
                 U std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char)
                 U std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
                 U typeinfo for cinder::app::AppLinux
                 U typeinfo for mongocxx::v_noabi::logger
                 U typeinfo for std::runtime_error
                 U typeinfo for std::exception
                 U vtable for __cxxabiv1::__class_type_info
                 U vtable for __cxxabiv1::__si_class_type_info

- cat /usr/local/include/bsoncxx/v_
noabi/bsoncxx/config/version.hpp:

// Copyright 2014 MongoDB Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#define BSONCXX_VERSION_MAJOR 3
#define BSONCXX_VERSION_MINOR 1
#define BSONCXX_VERSION_PATCH 1
#define BSONCXX_VERSION_EXTRA

Rassi

não lida,
27 de jan. de 2017, 17:07:0627/01/2017
para mongodb-user
It looks like the issue you're running into is that your application and your build of the driver don't agree on which version of the libstdc++ ABI to use. See  https://gcc.gnu.org/onlinedocs/libstdc%2B%2B/manual/using_dual_abi.html for background on the libstdc++ "Dual ABI".  This almost certainly also explains the run-time error you're encountering (bsoncxx::string::view_or_value is getting different definitions in different translation units).

Take a look at the nm output (emphasis added) for the following example program, when compiled with different values for _GLIBCXX_USE_CXX11_ABI.  When the example program is compiled against the new implementation (which is the default in libstdc++ 5.1 and newer), you can see that the basic_string constructor is declared inside the std::__cxx11 namespace, and that the [abi:cxx11] annotation is included in the demangled symbol name for a function that returns a std::string:

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ cat foo.cpp
#include <string>

std::string f(int a, int b) {
   return std::string();
}
$ g++ -O0 -D_GLIBCXX_USE_CXX11_ABI=1 -c -Wall foo.cpp && nm --demangle foo.o
0000000000000000 T f[abi:cxx11](int, int)
                 U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()
$ g++ -O0 -D_GLIBCXX_USE_CXX11_ABI=0 -c -Wall foo.cpp && nm --demangle foo.o
0000000000000000 T f(int, int)
                 U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()

From the nm output you provided, you can see that json.cpp.o (from libbsoncxx.a) was compiled against the new implementation (bsoncxx::v_noabi::to_json has a [abi:cxx11] annotation), but that main.cpp.o was compiled against the old implementation (it has an unresolved symbol for a basic_string constructor that isn't declared in the std::__cxx11 namespace).

To fix this, I'd first try to see if you can compile your application against the new implementation.  What's causing your program to be compiled against the old implementation is probably one of: 1) your compile line for main.cpp.o is explicitly setting -D_GLIBCXX_USE_CXX11_ABI=0, or 2) one of the headers you're including from Cinder is setting _GLIBCXX_USE_CXX11_ABI to zero with a #define, or 3) you're using a different toolchain to build your application than the one you're using to build the driver.

If you get different linker errors when compiling against the new implementation, then one of your dependencies (probably Cinder) is compiled against the old implementation; you can verify this by running nm on libcinder.a and looking for the same clues.  To fix that, I'd recommend trying to recompile Cinder from source against the new implementation.

I generally wouldn't recommend recompiling the driver against the old implementation (it generally doesn't seem like a good idea to compile C++11 programs with an implementation of std::string that doesn't comply with C++11), but you could do that as a last resort by passing "-DCXX_CMAKE_FLAGS=-D_GLIBCXX_USE_CXX11_ABI=0" as an argument to cmake.

~ rassi
...

Blake McConnell

não lida,
31 de jan. de 2017, 14:24:5331/01/2017
para mongodb-user
Thanks, Rassi.  This information was instrumental in solving the issue.  Turns out Cinder ships with Boost lib files compiled with the old ABI.   Removing these and rebuilding Cinder with the CMake flag -DCINDER_BOOST_USE_SYSTEM=1 (which points to the system-installed version of Boost rather than Cinder's Boost submodlue) resolved the linking issues.  Now everything works as expected.  Thanks again for your help Rassi!
Responder a todos
Responder ao autor
Encaminhar
0 nova mensagem