Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

F.A.Q.

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 11. Boost.DLL

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
  • Вопрос:Успешно. Безопасный DLL?
    • Ответ:Некоторые платформы позволяют одновременные вызовы<dlopen>, как функции. Для тех платформ, которые растут. DLL безопасен, как и весь C++ Стандартные библиотечные контейнеры: безопасно использовать различные экземпляры общей библиотеки из разных потоков, даже если все экземпляры загружают одну и ту же библиотеку. На других платформах небезопасно одновременно вызывать любую из функций от Boost. DLL (даже вызов<shared_library::location()>вызывает состояние гонки). См.Ограничения, Загрузка библиотечной нити.

  • Вопрос:Почему символы Linux из одного плагина видны в другом? Невозможно получить символ с тем же именем из правильного плагина!
    • Ответ:Вы столкнулись с проблемой тени символов. Составьте свои плагины с флагом «-fvisibility=hidden» и загляните в раздел «Обучение».

  • Вопрос:Как управляется Unicode (Windows)?
    • Ответ:Усиление. DLL поддерживает Unicode, чтобы вы могли предоставить ему пути Unicode.

  • Вопрос:Могу ли я открыть исполняемый файл?
    • Ответ:Да, можешь. Символы должны экспортироваться с использованием исполняемого файла<BOOST_SYMBOL_EXPORT>или<BOOST_DLL_ALIAS>. Вы можете позвонить<shared_library(program_location())>, чтобы загрузить себя. Обратитесь к разделу учебник для получения дополнительной информации. Вы также можете запросить исполняемые файлы, просто предоставьте путь к исполняемому классу<library_info>.

  • Вопрос:Что, если я укажу неправильный тип в<shared_library::get<T>>или<import<T>>?
    • Ответ:Обычно вы заканчиваете<SegmentationFault>. Однако безопасно делать типы более строгими, например, делать<constint>из<int>не повредит.

  • Вопрос:Гарантирует ли ваша библиотека стабильность методов?
    • Ответ:Библиотека гарантирует, что имена псевдонимов, созданные с использованием макросов<BOOST_DLL_ALIAS>, не изменятся с изменением компилятора или платформы. Вы должны самостоятельно позаботиться о стабильности функций ABI и API.

  • Вопрос:Существуют ли какие-либо ограничения на подпись экспортируемых/импортируемых функций?
    • Ответ:Нет. Вы можете импортировать / экспортировать функции с любой подписью и любым параметром возврата.

  • Вопрос:У меня есть 2 плагина, которые используют одну и ту же общую библиотеку. Будет ли разделяемая библиотека загружена дважды?
    • Ответ:No. Пугинс поделится экземпляром разделяемой библиотеки.

  • Вопрос:У меня есть 2 плагина, каждый из которых должен работать с собственной версией<libsome_library>общей библиотеки. Как этого добиться?
    • Ответ:Избегайте таких ситуаций, статично связывая libsome_library в каждый плагин и загружая плагины<load_mode::rtld_deepbind>.

  • Вопрос:Как загрузить общий объект из памяти??
    • Ответ:Все существующие операционные системы избегают загрузки общих библиотек непосредственно из пользовательской памяти, поэтому вы не найдете никаких сискалов для такого случая. В настоящее время Boost.DLL не предоставляет средств для честной загрузки общих объектов из памяти. Это требует повторного внедрения динамической линкерной логики в пользовательском пространстве для всех платформ, что является огромным объемом работы и очень подвержено ошибкам. Однако рабочие патчи приветствуются!

Workaround будет писать плагин во временный файл в оперативной памяти и загружать плагин из него:

#include <boost/filesystem.hpp>
#include <boost/dll.hpp>
using namespace boost;
dll:shared_library load_from_memory(unsigned char* data, std::size_t size, const filesystem::path& tmp_plugin_path = filesystem::unique_path() / "libplugin.so") {
    const filesystem::path plugin_location = filesystem::temp_directory_path() / tmp_plugin_path;
    filesystem::create_directories(plugin_location.parent_path());
    filesystem::ofstream ofs(plugin_location, std::ios::out|std::ios::bin|std::ios::trunc);
    ofs.write(data, size);
    return dll::shared_library(plugin_location);
}

Но нет никакой гарантии, что<filesystem::temp_directory_path()>действительно будет писать в ОЗУ, это очень зависит от платформы.


  • Вопрос:Я нашел ошибку, как мне уведомить?

PrevUpHomeNext

Статья F.A.Q. раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 11. Boost.DLL может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 11. Boost.DLL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:54:20/0.028988838195801/1