Ответы пользователя по тегу Visual Studio
  • Ошибка D8021 недопустимый числовой аргумент "/Wno-error=invalid-offsetof" откуда может появиться данная проблема и как решить?

    @Ariox41
    Строка
    set(CMAKE_PREFIX_PATH "C:\\Qt\\6.1.3\\mingw81_64\\lib\\cmake")

    намекает, что вы пытаетесь подключить бинарники, скомпилированные при помощи mingw, к проекту, собираемому при помощи msvc. Это в любом случае не сработает, ABI несовместимы.

    В данном случае это также может быть причиной ошибки, т.к. вы подключаете файлы конфигурации cmake, которые содержат флаги компилятора, которые при сборке были прописаны как публичная зависимость. Флаги от mingw, естественно, недопустимы для msvc.

    Проще говоря, либо установите версию Qt, соответствующую вашему компилятору, либо установите msys2, и используйте mingw + Qt из пакетов (но для mingw нет QWebEngine).
    Ответ написан
  • Как создать глобальный объект для всех элементов проекта?

    @Ariox41
    Вообще, вам стоит почитать про синглтоны в C++, но если лень, самый безопасный вариант - синглтон Майерса:
    #include <string>
    
    // Синглтон Майерса. Переменная str будет создана один раз при первом вызове getPrefix, начиная с c++11 это ещё и потокобезопастно.
    const std::string& getPrefix(){ 
        static std::string str  {"pref::"}; // Инициализация должна быть в конструкторе. 
        return str;
    }
    
    // Его использование.
    std::string addPrefix(const std::string& str){
        return getPrefix() + str; 
    }
    Ответ написан
    Комментировать
  • Как динамически подключать библиотеки?

    @Ariox41
    Посмотрите в сторону boost::DLL

    Позволяет динамически загружать библиотеки, автоматически подсчитывает ссылки на загруженные функции и выгружает библиотеку, когда все ссылки уничтожены (нужно учитывать, что если вы получаете какие-то данные вручную, их нужно уничтожить до того, как будет выгружена библиотека, поскольку библиотека не может подсчитывать ссылки на ваши данные).

    В документации много примеров, особых проблем не должно возникнуть.

    Пример из документации, на всякий случай:
    // my_plugin_api.hpp
    #include <string>
    
    class my_plugin_api {
    public:
       virtual std::string name() const = 0;
       virtual float calculate(float x, float y) = 0;
    
       virtual ~my_plugin_api() {}
    };

    Реализация плагина:
    // my_plugin_sum.cpp
    #include <boost/config.hpp> // for BOOST_SYMBOL_EXPORT
    #include "../tutorial_common/my_plugin_api.hpp"
    
    namespace my_namespace {
    
    class my_plugin_sum : public my_plugin_api {
    public:
        my_plugin_sum() {
            std::cout << "Constructing my_plugin_sum" << std::endl;
        }
    
        std::string name() const {
            return "sum";
        }
    
        float calculate(float x, float y) {
            return x + y;
        }
    
        ~my_plugin_sum() {
            std::cout << "Destructing my_plugin_sum ;o)" << std::endl;
        }
    };
    
    // Exporting `my_namespace::plugin` variable with alias name `plugin`
    // (Has the same effect as `BOOST_DLL_ALIAS(my_namespace::plugin, plugin)`)
    extern "C" BOOST_SYMBOL_EXPORT my_plugin_sum plugin;
    my_plugin_sum plugin;
    
    } // namespace my_namespace

    Собственно, загрузка библиотеки:
    #include <boost/dll/import.hpp> // for import_alias
    #include <iostream>
    #include "../tutorial_common/my_plugin_api.hpp"
    
    namespace dll = boost::dll;
    
    int main(int argc, char* argv[]) {
    
        boost::filesystem::path lib_path(argv[1]);          // argv[1] contains path to directory with our plugin library
        boost::shared_ptr<my_plugin_api> plugin;            // variable to hold a pointer to plugin variable
        std::cout << "Loading the plugin" << std::endl;
    
        plugin = dll::import<my_plugin_api>(          // type of imported symbol is located between `<` and `>`
            lib_path / "my_plugin_sum",                     // path to the library and library name
            "plugin",                                       // name of the symbol to import
            dll::load_mode::append_decorations              // makes `libmy_plugin_sum.so` or `my_plugin_sum.dll` from `my_plugin_sum`
        );
    
        std::cout << "plugin->calculate(1.5, 1.5) call:  " << plugin->calculate(1.5, 1.5) << std::endl;
    }

    Вывод:
    Loading the plugin
    Constructing my_plugin_sum
    plugin->calculate(1.5, 1.5) call:  3
    Destructing my_plugin_sum ;o)
    Ответ написан
    Комментировать
  • Проблемы с компиляцией в visual studio 2015, после адаптации с visual studio 2010. Что делать?

    @Ariox41
    std::array создается на стеке как обычный сишный массив и требует указания размера во время компиляции, примерно так: std::array<int, 3> array = {1, 2, 3};

    Edit: Возможно, там нужен не std::array, а что-то другое, но где-то использован using namespace std
    Edit: Не сразу въехал во вторую часть. Шаблонный параметр должен быть известен во время компиляции, т.е. bmp->Width должен быть constexpr или statc constexpr с соответствующим синтаксисом обращения. Динамические массивы в С++ - это std::vector, у вас скорее всего использовался array из CLI, но в CLI я не разбираюсь.
    Ответ написан
    1 комментарий