Ошибка при загрузке общих библиотек: libbsoncxx.so._noabi: невозможно открыть общий объектный файл: нет такого файла или каталога - PullRequest
0 голосов
/ 02 июля 2018

Я установил драйвер mongocxx, как показано http://mongodb.github.io/mongo-cxx-driver/mongocxx-v3/installation/ и когда я тестирую драйвер, все выглядит нормально, но если немного изменить код, я получаю ошибку при загрузке общих библиотек: libbsoncxx.so._noabi: не могу открыть файл общего объекта: нет такого файла или каталога .

Код:

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

if(POLICY CMP0025)
    cmake_policy(SET CMP0025 NEW)
endif()

project(test_mongodb LANGUAGES C CXX)

if(NOT DEFINED CMAKE_CXX_STANDARD)
    set(CMAKE_CXX_STANDARD 11)
endif()

set(CMAKE_PREFIX_PATH CMAKE_PREFIX_PATH "~/opt/mongo-cxx-driver/install")
set(CMAKE_CXX_EXTENSIONS OFF)

if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror")
endif()


add_executable(test_mongodb main.cpp)

find_package(libmongocxx REQUIRED)

target_include_directories(test_mongodb
        PRIVATE ${LIBMONGOCXX_INCLUDE_DIRS}
        )

target_link_libraries(test_mongodb
        PRIVATE ${LIBMONGOCXX_LIBRARIES}
        )

target_compile_definitions(test_mongodb
        PRIVATE ${LIBMONGOCXX_DEFINITIONS}
        )

add_custom_target(run
        COMMAND test_mongodb
        DEPENDS test_mongodb
        WORKING_DIRECTORY ${CMAKE_PROJECT_DIR}
        )

list(FIND LIBMONGOCXX_DEFINITIONS "BSONCXX_STATIC" LIST_IDX)
if (${LIST_IDX} GREATER -1)
    message(FATAL_ERROR "Expected BSONCXX_STATIC to not be defined")
endif()
list(FIND LIBMONGOCXX_DEFINITIONS "MONGOCXX_STATIC" LIST_IDX)
if (${LIST_IDX} GREATER -1)
    message(FATAL_ERROR "Expected MONGOCXX_STATIC to not be defined")
endif()

main.cpp

#include <iostream>

#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>

#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/cursor.hpp>


int main(int argc, char* argv[]) {
    using bsoncxx::builder::basic::kvp;
    using bsoncxx::builder::basic::make_document;

    mongocxx::instance inst;

    try {
        const auto uri = mongocxx::uri{(argc >= 2) ? argv[1] : mongocxx::uri::k_default_uri};

        auto client = mongocxx::client{uri};
        auto admin = client["admin"];
        auto result = admin.run_command(make_document(kvp("isMaster", 1)));
        std::cout << bsoncxx::to_json(result) << std::endl;

        return EXIT_SUCCESS;
    } catch (const std::exception& xcp) {
        std::cout << "connection failed: " << xcp.what() << std::endl;
        return EXIT_FAILURE;
    }
}

Если я удаляю auto result = admin.run_command(make_document(kvp("isMaster", 1))); из кода, я получаю ошибку при загрузке общих библиотек: libbsoncxx.so._noabi , если не работает нормально. Есть идеи, почему он так себя ведет?

Ubuntu 18.04 сс 7.3.0, с ++ 7.3.0, CMake 3.11.3

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Когда я использовал readelf, я получил:

File: libmongocxx.so

(NEEDED) Shared library: [libbsoncxx.so._noabi]
(NEEDED) Shared library: [libmongoc-1.0.so.0]
(NEEDED) Shared library: [libbson-1.0.so.0]
(NEEDED) Shared library: [libstdc++.so.6]
(NEEDED) Shared library: [libgcc_s.so.1]
(NEEDED) Shared library: [libc.so.6]
(SONAME) Library soname: [libmongocxx.so._noabi]
(RUNPATH) Library runpath: [/home/adam/opt/mongo-c-driver/install/lib]

File: test_mongodb ( with error )
(NEEDED) Shared library: [libmongocxx.so._noabi]
(NEEDED) Shared library: [libstdc++.so.6]
(NEEDED) Shared library: [libc.so.6]
(RUNPATH) Library runpath: [/home/adam/opt/mongo-cxx-driver/install/lib]

File: test_mongodb ( without error )
(NEEDED) Shared library: [libmongocxx.so._noabi]
(NEEDED) Shared library: [libbsoncxx.so._noabi]
(NEEDED) Shared library: [libstdc++.so.6]
(NEEDED) Shared library: [libgcc_s.so.1]
(NEEDED) Shared library: [libc.so.6]
(RUNPATH) Library runpath: [/home/adam/opt/mongo-cxx-driver/install/lib]
0 голосов
/ 02 июля 2018

Вы входите в подсистему CMake find на слишком низком уровне: драйвер Mongo C ++ обеспечивает интеграцию с подсистемой CMake find_package, которая выполняет большую часть этой работы за вас. Вы просто должны иметь возможность сказать find_package(libmongocxx REQUIRED) и затем использовать предварительно заполненные переменные LIBMONGOCXX_{INCLUDE_DIRS,LIBRARIES,DEFINITIONS}.

Пожалуйста, посмотрите каталог верхнего уровня examples/projects в исходном коде для многих примеров проектов, которые показывают, как интегрироваться с {mongo,bson}cxx через CMake find_package и pkgconfig.

Я думаю, учитывая использование, на которое вы нацелены, вы должны начать с каталога examples/projects/mongocxx/cmake/shared.

...