«Смешивать библиотеку dll boost со статической средой выполнения - действительно плохая идея ...» - PullRequest
7 голосов
/ 02 марта 2012

У меня есть два проекта в решении Visual Studio.Один создает статическую LIB, другой - динамическую DLL.Оба используют статическое связывание во время выполнения (/ MT и / MTd), и оба используют Boost.Повышение не было моим решением - я хотел бросить его, но я был отвергнут комитетом.

LIB работает нормально, но DLL выдает ошибку из auto_link.hpp (строка 354): «Смешивание dll boostбиблиотека со статическим временем выполнения - очень плохая идея ... ".

#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
#  define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
#  error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
#  define BOOST_LIB_PREFIX "lib"
#endif

Я не определил BOOST_DYN_LINK.Кажется, Boost делает скачок, что, поскольку я собираю DLL (определены _USRDLL и _WINDLL), мне нужно динамическое связывание во время выполнения (/ MD или / MDd, который определяет _DLL) или связывание DLL с Boost.Это неверно, так как я специально просил статическое связывание (/ MT или /MTd).

Я подал отчет об ошибке против Boost за его неверные предположения, но это не помогает мне с использованиембиблиотека.В отчете сопровождающие Boost настаивают на том, чтобы я его настраивал (несмотря на то, что аудит показал, что это не так; Boost манипулирует им как минимум в 30 файлах).Я нашел один ответ в списке рассылки Boost, в котором, по сути, говорится об изменении настроек моего проекта для поддержки Boost.

Изменение на динамическое связывание во время выполнения (/ MD и / MDd) невозможно, посколькустатическое связывание было выбрано (1) из соображений безопасности, и (2) другая библиотека использует статическое связывание.Это не подлежит обсуждению - у нас нет выбора.

Подведем итог для ясности (TLDR): я хочу использовать статическое связывание для всего, в то время как моя выходная программа - DLL (не статическая LIB, не EXE).).Все статически связано в DLL.

Кто-нибудь знает, как использовать эту библиотеку в Windows для создания DLL со статическим связыванием?

Ответы [ 2 ]

31 голосов
/ 02 марта 2012

Краткая версия: слушайте ребят на Boost ML.Boost не поддерживает то, что вы пытаетесь сделать, и в любом случае это плохая идея.Лучше всего принять это и заставить другую библиотеку использовать динамическое время выполнения.

Более длинная версия:

Похоже, вы неправильно понимаете, что говорит вам Boost.Вы пытаетесь проанализировать исходный код Boost вместо того, чтобы просто прочитать то, что он говорит:

auto_link.hpp (строка 354): «Смешивать библиотеку dll boost со статической средой выполнения очень плохоidea ... ".

Boost считает, что вы создаете DLL, одновременно статически связываясь с библиотеками времени выполнения.Что именно вы делаете;Boost точно определил, что вы пытаетесь сделать.

Ваша проблема в том, что библиотека Boost не поддерживает поддержку , встроенную в DLL, которая не динамически связывается с библиотеками времени выполнения.Причина в том, что это «действительно плохая идея».Таким образом, они проверяют, пытаетесь ли вы это сделать, и останавливают сборку с сообщением об ошибке, напоминающим вам об этом.

«Свободные друзья» в Boost, которые не знают, как заставить что-то работать »"из коробки" предотвратите это, потому что статическая ссылка на среду выполнения в DLL обычно является ошибкой пользователя.Это либо сделано случайно, либо из-за незнания основных проблем, которые это может создать.

Если вы статически ссылаетесь на среды выполнения, у каждой DLL / exe будет своя копия среды выполнения со своими глобальными переменными.А так как heap управляется через глобальные переменные, это означает, что каждая DLL / exe будет иметь свою собственную кучу.Так что если вы попытаетесь освободить память, выделенную в другом адресном пространстве ... бум.И это намного проще, чем вы думаете, если вы не будете осторожны.

Это может вызвать и другие проблемы.«Фриларты» пытаются помешать вам выстрелить себе в ногу.Но, очевидно, вы знаете лучше, чем «навязывать свою чушь честным и ничего не подозревающим пользователям», которые могут захотеть получить уведомление, когда они собираются проехать по обрыву.

Теперь вы можете просто удалить сообщение об ошибке.Большая часть Boost - это заголовки, поэтому, если вы на самом деле не ссылаетесь ни на один из его .libs, у вас все будет хорошо.Тем не менее, я предполагаю, что auto_link.hpp используется только теми частями Boost, которые являются .libs. Скорее всего, факт, что вы столкнулись с ним, означает, что вы пытаетесь связать его с Boost .lib.

Переход на динамическое связывание во время выполнения (/ MD и / MDd) невозможен, поскольку статическое связывание было выбрано (1) из соображений безопасности и (2) другая библиотека использует статическое связывание.

Если безопасность имеет значение, вы должны знать об этом: сам факт создания библиотеки DLL означает, что ваше приложение потенциально открыто для инъекций DLL, независимо от того, как вы ссылаетесь на среды выполнения.Поэтому я не понимаю, насколько динамическое связывание менее безопасно, чем статическое.

10 голосов
/ 05 июля 2015

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

Короче говоря, если у вас есть boost-python, Boost неправильно предотвращает статическое связывание наддува с помощью / MTswitch.

Эта проблема легко решается путем определения BOOST_PYTHON_STATIC_LIB перед включением заголовков повышения.

...