Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
Заблокирован

STL in DLL, нормальная работа не возможна?

04.11.2014, 22:09. Показов 5244. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! Как известно, STL - это библиотека стандартных шаблонов, то есть template-ная библиотека, но шаблоны экспортировать же нельзя из DLL...
В общем, если даже создать базовый проект DLL в VisualStudio2013 и написать в экспортируемом классе так:
C++
1
2
3
4
5
6
7
8
9
10
11
#ifdef WIN32PROJECT1_EXPORTS
#define WIN32PROJECT1_API __declspec(dllexport)
#else
#define WIN32PROJECT1_API __declspec(dllimport)
#endif
 
class WIN32PROJECT1_API CWin32Project1 {
public:
    CWin32Project1();
    std::string str; //ДАЖЕ ЭТО УЖЕ НЕ ПРОАТИТ
};
то в ответ:
C++
1
warning C4251: 'CWin32Project1::str' : class 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' needs to have dll-interface to be used by clients of class 'CWin32Project1'
Есть ли способ как то заставить нормально работать STL в DLL?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.11.2014, 22:09
Ответы с готовыми решениями:

stl и dll
Вот собственно, как передать например stl::vector из dll библиотеке в другую программу... DLL.H #include &lt;vector&gt; #define...

STL внутри DLL
Вопрос, что надо сделать в visual studio, что бы в функции которая находится в DLL можно было использовать STL? если пытаюсь создать объект...

Использование STL в DLL-файлах
Хочу использовать библиотеку STL в своем DLL-проекте. В частности для обеспечения функциональности требуется применение классов vector и...

40
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.11.2014, 16:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
programina, что - то давно новой демки твоей супер игры не было, когда ожидать?
А уж как давно не было твоей демки. Стой, а она вообще была когда-либо?
По крайней мере я пишу игру, а не отвлекаюсь на всякие STL, boost и прочие не нужные в играх вещи.
0
Заблокирован
06.11.2014, 16:15  [ТС]
Даже больше скажу, изучив подробней Pimpl я понял, что это ерунда.
И опять неоднозначность.

Что посоветуете выбрать в случае не использования идиомы Pimpl, использования STL и с целью спрятать исходный код от будущих потребителей моей библиотеки с целью продажи им сего и невозможностью на его базе сделать без моего ведома слегка изменённый дубликат. Ну просто чтоб не воровали ититская туча

1. Собирать всё в DLL и управление выносить в С-шные интерфейсы

2. Забить на DLL, собирать всё в статическую библиотеку (LIB) и бояться, что у кого то она не будет работать, т.к. убеждённый пугал её несовместимость с разными версиями VisuaStudiom про другие IDE я вообще молчу.

3. Забить на всё и делать просто набор классов с открытым кодом, который можно продать один раз - потом сразу его украдут и пока лавэ

Добавлено через 23 секунды

Не по теме:

Цитата Сообщение от programina Посмотреть сообщение
а не отвлекаюсь на всякие STL, boost и прочие не нужные в играх вещи.
:jokingly:

0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.11.2014, 16:27
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
3. Забить на всё и делать просто набор классов с открытым кодом
Конечно. Это же очевидно.
0
Заблокирован
06.11.2014, 16:53  [ТС]
Цитата Сообщение от programina Посмотреть сообщение
Конечно. Это же очевидно.
Ну лично для меня это совсем не очевидно... Для чего нужно тратить столько времени и сил? Для того, чтоб у тебя в итоге всё украли и ты ничего бы на этом не заработал? Где логика?
В пользу варианты из п.3 можно сказать лишь то, что в принципе движок всё равно можно спереть и хакнуть, что его разработчик ничего не узнает, а игр можно делать много и на каждой зарабатывать,особенно в случае онлайн игр. Ну то есть чтоб зарабатывать не на движке, а на играх, на этом движке

Всё. В топку, останавливаюсь на FastPimpl и DLL
programina, я тебе на днях кину на геймдеве архив с моделью движка, ну там какие - нибуть окошки создавать можно будет - посмотришь, как удобно использовать что уже готовое из коробки
0
06.11.2014, 17:11

Не по теме:

Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Для чего нужно тратить столько времени и сил? Для того, чтоб у тебя в итоге всё украли и ты ничего бы на этом не заработал? Где логика?
"Поскольку денег нет [...] я принял гениальное решение - теперь я пишу бесплатный код. Это кормит лучше." Источник.

0
Заблокирован
06.11.2014, 17:55  [ТС]

Не по теме:

Цитата Сообщение от 0x10 Посмотреть сообщение
"Поскольку денег нет [...] я принял гениальное решение - теперь я пишу бесплатный код. Это кормит лучше." Источник.
Первый комент порадовал
klirichek: ага, "волосатое существо в рыжей майке" уже проиндексировалось и вещает.

0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.11.2014, 18:25
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Для чего нужно тратить столько времени и сил? Для того, чтоб у тебя в итоге всё украли и ты ничего бы на этом не заработал? Где логика?
Ну с таким подходом тебе прямая дорога работать в Valve, они тоже страшно не любят терять свои драгоценные исходники.

Не по теме:

Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
я тебе на днях кину на геймдеве архив с моделью движка, ну там какие - нибуть окошки создавать можно будет - посмотришь, как удобно использовать что уже готовое из коробки
Нет уж, создавай там тему и выкладывай, чтобы все видели, что твои один миллион первые обещания не пустые слова.

0
Заблокирован
06.11.2014, 18:37  [ТС]
Цитата Сообщение от programina Посмотреть сообщение
Нет уж, создавай там тему и выкладывай, чтобы все видели, что твои один миллион первые обещания не пустые слова.
Тему создам, когда будет первая демка, без демки тема быстро увязнет в троль спаме

По сабжу:
Если я буду писать игровой движок в чисто в наборах открытых классов, ну то есть ни в динамической библиотеке, ни в статической, то в теории, малой кровью, можно будет потом всё это барахло собрать в DLL, учитывая то, что буду использовать STL и не буду прятать реализацию в Private классы согласно Pimpl ?
0
 Аватар для TrueBit
100 / 100 / 47
Регистрация: 19.11.2012
Сообщений: 195
06.11.2014, 18:47
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Есть ли способ как то заставить нормально работать STL в DLL?
Не знаю как у вас, а у меня STL нормально работает внутри самой dll. Пример с microsoft.com прекрасно компилируется и собирается. Главное не забыть добавить заголовки требуемых контейнеров STL.
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.11.2014, 21:11
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
создать базовый проект DLL
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
можно будет потом всё это барахло собрать в DLL
-THE_MASTER666-, ни разу не видела, чтобы в играх были DLL (не считая спец. игровых библиотек, типа: cuda, nvidia physics, openal и др.). Ты свой движок-игру будешь продавать по частям что-ли?
Например: внимание, только пока действует акция, вы можете купить у меня "супер-пупер многопользовательский экспериментальный шутер" и совершенно бесплатно получить поддержку движком игры света и динамических теней (библиотеки light.dll и shadow.dll)
0
Заблокирован
06.11.2014, 21:40  [ТС]
Цитата Сообщение от programina Посмотреть сообщение
ни разу не видела, чтобы в играх были DLL
Странно, обычно в играх много DLL-к.
Цитата Сообщение от programina Посмотреть сообщение
Ты свой движок-игру будешь продавать по частям что-ли?
Ну ты чего прикалываешься что ли? Мой движок - это одна (в будущем может и больше) DLL, эта DLL подключается к проекту игры и игра пишется уже на моей DLL-ке, то есть на движке (использует функции DLL-ки ёмаё, как ещё объяснить ), вот и все фокусы.
То есть свой движок - то есть набор библиотек + готовые утилитки типа редакторов и пр + документация, можно продавать отдельно, чтоб программисты на этом движке делали свои игры и платили мне дань за использование движка (посмотри на любой движок - Unreal Develpment Kit / Unity3D тд - там схема аналогичная). Ну и естественно отдельный ЕХЕ будем с моей игрой, которую я и буду делать используя свой же движок. То есть я параллельно веду два проекта, движок и игру, развивая их параллельно. Как разовью движок до какого - то продакшен состояния, тогда уже и можно будет продавать его первую версию.
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.11.2014, 21:48
-THE_MASTER666-, а у тебя уже есть то, что можно класть в DLL? Может сначала сделать более-менее сложную демосценку, а потом, убирать из нее в DLL. А то ведь ты когда сделаешь свою DLL будешь всем говорить, что не можешь показывать DLL так как боишься, что ее будут использовать в своих проектах постороние, и в итоге никто так и не увидит твою демосценку.
0
Заблокирован
06.11.2014, 22:03  [ТС]
Цитата Сообщение от programina Посмотреть сообщение
Может сначала сделать более-менее сложную демосценку
Да мне демо сценка не к чему, т.к. я отлично знаю DirectX и как там всё устроено, по этому буду делать всё более менее серьёзно с самого начала.

А по поводу DLL... Я так и не у услышал какой -то дельной рекомендации по поводу того, как лучше спрятать код для продажи...
Если делать DLL, то логичней использовать идеому Pimpl, но это ж такой геморой если разобраться, это по хорошему для каждого класса нужно делать прокси видимый класс, который будет повторять все функции... Геморойно как то и коряво.

В общем я решил писать открытый код, точнее не сосем открытый, буду собирать отдельный проект из набора классов движка в статическую библиотеку и её уже буду использовать в программе - игре.
Но по сути это открытый код.
Цитата Сообщение от programina Посмотреть сообщение
и в итоге никто так и не увидит твою демосценку.
вот по этому я и буду делать статическую библиотеку, которая будет вкомпилена в ЕХЕ игры и никто моим движком не воспользуется, если я этому кому то не продам исходники. Всё путём! (точнее не всё, т.к. после первой продажи мои исходники поселяться на торретнах )
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
07.11.2014, 01:07
Так вроде нормальная ситуация держать код в опенсорсе, радоваться тому, что сообщество его допиливает и продавать систему для корпоративных клиентов.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13240 / 6872 / 1827
Регистрация: 18.10.2014
Сообщений: 17,419
07.11.2014, 01:17
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
но шаблоны экспортировать же нельзя из DLL
Шаблоны и не надо ниоткуда никуда экспортировать. Шаблонные библиотеки построены целиком на заголовочных файлах. Они включаются независимо как в код DLL, так и в код, использующий DLL. Никаких дополнительных усилий при этом предпринимать не надо - что касается именно шаблонов, все будет прекрасно работать без какого-либо экспорта. Никакой __declspec(dllexport)/__declspec(dllimport) с шаблонам никогда не нужен (пока речь не заходит об явной инстанциации или явной специализации).

Проблема здесь совсем другого толка, не имеющего никакого отношения ни к шаблонам, ни к STL как таковому. Проблема в том, что DLL использует свои глобальные структуры управления динамической памятью, а внешний код - свои. Смешивать эти структуры - нельзя. Например, память выделенную через 'new' внутри DLL нельзя освободить через 'delete' во внешнем коде. Именно это мешает использованию STL контейнеров через границу раздела DLL и внешнего кода, именно потому, что STL контейнеры внутренне занимаются управлением динамической памятью.
0
Заблокирован
07.11.2014, 09:05  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Шаблоны и не надо ниоткуда никуда экспортировать. Шаблонные библиотеки построены целиком на заголовочных файлах
Если экспортируешь класс, в котором объявлен вектор - получишь ряд проблем, описанный многими постами выше.
Так же можешь глянуть про всё это дело тут https://rsdn.ru/article/cpp/stlproblem.xml например

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Например, память выделенную через 'new' внутри DLL нельзя освободить через 'delete' во внешнем коде.
Почему же такой код работает на ура и никаких проблем:
DLL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifdef WIN32PROJECT1_EXPORTS
#define WIN32PROJECT1_API __declspec(dllexport)
#else
#define WIN32PROJECT1_API __declspec(dllimport)
#endif
 
class WIN32PROJECT1_API CWin32Project1
{
public:
    CWin32Project1(){};
    int* Get()
    {
        return new int[100];
    };
};
КОД:
C++
1
2
3
CWin32Project1 p;
int* test = p.Get();
delete test;
Добавлено через 2 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
и продавать систему для корпоративных клиентов.
А почему бы корпоративному клиенту просто не взять твой код как все и не встроить его в свою программу, тебя не спрашивая?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13240 / 6872 / 1827
Регистрация: 18.10.2014
Сообщений: 17,419
07.11.2014, 09:17
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Так же можешь глянуть про всё это дело тут https://rsdn.ru/article/cpp/stlproblem.xml например
"Про всё это дело тут" я вижу описание двух проблем:

Первая проблема - именно то, что я описал выше. Не имеет никакого отношения к STL или шаблонам как таковым.

Вторая проблема - действительно имеет место, но сильно зависит от реализации, и, как мне казалось, присутствующая только в архаичных версиях STL из старинных комплектов Visual Studio. Я не прав?

Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Почему же такой код работает на ура и никаких проблем:
Во-первых, работает такой код или нет - надо тестировать. Разрушение внутренних структур динамической памяти, если оно происходит, редко проявляется сразу.

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

В-третьих, вполне может быть проблема уже починена в нынешних версиях.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
07.11.2014, 09:36
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Почему же такой код работает на ура и никаких проблем:
Потому что в настройках проекта у тебя скорее всего используется один и тот же C++ runtime и для exe и для dll. В этом случае этот сценарий работает. Как только появляются разные версии runtime (а ты, как разработчик dll, не сможешь дать гарантии, что этого не произойдет, особенно если собираешься ее продавать третьим лицам), появляются и проблемы описанные в посте 35.

Добавлено через 15 минут
Уточнение: под версиями понимаются как версии в сысле "экземпляры" одного и того же runtime, так и версии в смысле номеров релизов.
Т.е. если у тебя dll статически линкует C++ runtime и exe статически линукет тот же самый runtime, то это вызовет проблемы на приведенном тобой коде.
И если dll скомпилирована была с одной версией (в смысле номера версии релиза) C++ runtime, а exe с другой - это также приведет к прблемам в этом коде.
Ключевые слова: нарушение ODR.
0
Заблокирован
07.11.2014, 10:44  [ТС]
Хмм, я забыл добавить, что в моём примере из поста 36 я подключал DLL-ку неявно через библиотеку импорта LIB.
Может в таком случае всё и должно работать?
Я имею ввиду то, что возможно такие проблемы возникают только в случае LoadLibrary ? Ну когда библиотеку явно загружаешь и ищешь функционал по экспортируемым именам?
По остальному - отвечу позжу
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
07.11.2014, 12:10
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А почему бы корпоративному клиенту просто не взять твой код как все и не встроить его в свою программу, тебя не спрашивая?
А для этого и нужны лицензии с отделом К.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.11.2014, 12:10

Что такое вторая нормальная и третья нормальная форма
Объясните пожалуйста по простому, что такое вторая нормальная и третья нормальная форма

3 планки памяти - нормальная работа?
Привет есть системник (лет 7) брали для офисных задач, но продавец поставил всего 1 Гб памяти Samsung M378T2863EHS-CF7 Компьютер брата,...

Нормальная работа в JavaFX в intellej idea?
Встроенный Scene Builder ужасен, просто капец, невозможно работать. А отдельную инсталляцию я так понимаю скачать уже невозможно? Как...

Нормальная работа ПК только с интегрированной видеокартой
Одним чудесным летним днём наслаждался творчеством некого автора на ютубе и в один момент внезапно потух монитор. Честно, не могу сейчас...

Возможна ли работа базы данных 1С в Qt?
Приветствую. Возможно название не правильно сформулировано, но все же. Моему отцу на предприятие нужна программа, в которой есть работа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru