Допустимо ли dll компилить с /MT?
От: vkalitkin  
Дата: 02.03.15 05:10
Оценка:
Есть exe + dll (Qt, OpenSSl + другие) которые скомпилены с /MD, для работы они требуют установки рантайма VS2013, возможно ли все dll скомпилить с /MT чтобы рантайма не требовали? Или от того что в каждой dll/exe будет отдельный менеджер памяти возникнут проблемы? В итоге хотел бы получить чисто Portable вариант программы который работает сразу с флешки на любой винде от XP/Win2003 и далее
Re: Допустимо ли dll компилить с /MT?
От: vkalitkin  
Дата: 02.03.15 05:24
Оценка:
Еще как вариант — в документации написано что можно подкладывать рантайм локально в ту же папку что exe (msvcp120.dll msvcr120.dll vccorlib120.dll), но на практике почему то не получается, программа запускается и зависает. Я помню это работало в VS2008, но в более поздних уже нет. Может кто знает что еще нужно сделать кроме подкладывания этих dll?
Re: Допустимо ли dll компилить с /MT?
От: fdn721  
Дата: 02.03.15 05:41
Оценка:
Здравствуйте, vkalitkin, Вы писали:

V>Есть exe + dll (Qt, OpenSSl + другие) которые скомпилены с /MD, для работы они требуют установки рантайма VS2013, возможно ли все dll скомпилить с /MT чтобы рантайма не требовали? Или от того что в каждой dll/exe будет отдельный менеджер памяти возникнут проблемы? В итоге хотел бы получить чисто Portable вариант программы который работает сразу с флешки на любой винде от XP/Win2003 и далее


Да, можно. Если всё будет собрано одним компилятором, то проблем не будет. Но это тот ещё геморрой.
Re: Допустимо ли dll компилить с /MT?
От: fdn721  
Дата: 02.03.15 05:43
Оценка: +1
Да и если цель сделать полностью транспортабельную версию, то можно все нужные dll положить рядом, и написать правильный manifest. На мой взгляд это будет на много проще.
Re[2]: Допустимо ли dll компилить с /MT?
От: vkalitkin  
Дата: 02.03.15 05:53
Оценка:
F>Да и если цель сделать полностью транспортабельную версию, то можно все нужные dll положить рядом, и написать правильный manifest. На мой взгляд это будет на много проще.

А не могли бы вы привести пример правильного манифеста для портабельной версии?
Re[3]: Допустимо ли dll компилить с /MT?
От: fdn721  
Дата: 02.03.15 06:01
Оценка:
Здравствуйте, vkalitkin, Вы писали:

F>>Да и если цель сделать полностью транспортабельную версию, то можно все нужные dll положить рядом, и написать правильный manifest. На мой взгляд это будет на много проще.


V>А не могли бы вы привести пример правильного манифеста для портабельной версии?


Например для CRT от VS2010 примерно так:

Microsoft.VC100.CRT.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright © 1981-2001 Microsoft Corporation-->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
                                 manifestVersion="1.0">
  <noInheritable/>
  <assemblyIdentity
    type="win32"
    name="Microsoft.VC100.CRT"
    version="9.0.21022.8"
    processorArchitecture="x86"
    publicKeyToken="1fc8b3b9a1e18e3b" />
  <file name="msvcr100d.dll"/>
  <file name="msvcp100d.dll"/>
</assembly>


Для остальных аналогично.
Re[2]: Допустимо ли dll компилить с /MT?
От: ArtDenis Россия  
Дата: 02.03.15 06:45
Оценка: 4 (1)
Здравствуйте, fdn721, Вы писали:

F>Да, можно. Если всё будет собрано одним компилятором, то проблем не будет.


Это неправильно. /MT для динамической библиотеки допустимо только в том случае, когда между вызывающим кодом и динамической библиотекой не передаются объекты классов, а освобождение памяти происходит в том же модуле, в котором она была выделена.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Отредактировано 02.03.2015 6:45 ArtDenis . Предыдущая версия .
Re[2]: Допустимо ли dll компилить с /MT?
От: okman Беларусь https://searchinform.ru/
Дата: 02.03.15 06:48
Оценка: +1
Здравствуйте, vkalitkin, Вы писали:

V>Еще как вариант — в документации написано что можно подкладывать рантайм локально в ту же папку что exe (msvcp120.dll msvcr120.dll vccorlib120.dll), но на практике почему то не получается, программа запускается и зависает. Я помню это работало в VS2008, но в более поздних уже нет. Может кто знает что еще нужно сделать кроме подкладывания этих dll?


В VS2005 и VS2008 нужна была магия с манифестами.
В VS2010 и выше манифесты для Visual C/C++ Runtime не используются, так что
должно работать простым копированием msvcpXX.dll и msvcrXX.dll
(сам много раз так делал).
Re[4]: Допустимо ли dll компилить с /MT?
От: okman Беларусь https://searchinform.ru/
Дата: 02.03.15 06:49
Оценка:
Здравствуйте, fdn721, Вы писали:

F>Например для CRT от VS2010 примерно так:


F>Microsoft.VC100.CRT.manifest


F>
F><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
F><!-- Copyright © 1981-2001 Microsoft Corporation-->
F><assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
F>                                 manifestVersion="1.0">
F>  <noInheritable/>
F>  <assemblyIdentity
F>    type="win32"
F>    name="Microsoft.VC100.CRT"
F>    version="9.0.21022.8"
F>    processorArchitecture="x86"
F>    publicKeyToken="1fc8b3b9a1e18e3b" />
F>  <file name="msvcr100d.dll"/>
F>  <file name="msvcp100d.dll"/>
F></assembly>
F>


9.0.21022.8 — это номер версии от VS2008, а не VS2010.
Re[3]: Допустимо ли dll компилить с /MT?
От: fdn721  
Дата: 02.03.15 06:51
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Это неправильно. /MT для динамической библиотеки допустимо только в том случае, когда между вызывающим кодом и динамической библиотекой не передаются объекты классов, а освобождение памяти происходит в том же модуле, в котором она была выделена.


Согласен, был неправ.
Re[3]: Допустимо ли dll компилить с /MT?
От: vkalitkin  
Дата: 02.03.15 07:00
Оценка:
O>должно работать простым копированием msvcpXX.dll и msvcrXX.dll
O>(сам много раз так делал).

Ну вот увы не работает.
Если без них — пишет что такие dll не найдены.
Если их просто в локальный каталог добавить — то зависает при запуске (в процессах висит, но окно не появляется).
Если установить рантайм — то все сразу работает как надо.

Потому у меня подозрения что установщик VS2013 рантайма что то еще делает кроме копирования dll, может в реестре что прописывает или еще какие дополнительные файлы устанавливает.
Re[4]: Допустимо ли dll компилить с /MT?
От: okman Беларусь https://searchinform.ru/
Дата: 02.03.15 07:23
Оценка:
Здравствуйте, vkalitkin, Вы писали:

V>Ну вот увы не работает.


А версии dll точно совпадают (те, которые подкладываются ручками и те, которые ставит vcredist.exe) ?
Re[5]: Допустимо ли dll компилить с /MT?
От: vkalitkin  
Дата: 02.03.15 12:37
Оценка:
O>А версии dll точно совпадают (те, которые подкладываются ручками и те, которые ставит vcredist.exe) ?

Совпадают. Но дело похоже в другом.

я подкладывал в виде

..\AppFolder\AppName.exe
..\AppFolder\msvcp120.dll
..\AppFolder\msvcr120.dll

а надо было в виде

..\AppFolder\AppName.exe
..\AppFolder\Microsoft.VC120.CRT\msvcp120.dll
..\AppFolder\Microsoft.VC120.CRT\msvcr120.dll

Позже поэксперементирую еще на разных системах.
Re[6]: Допустимо ли dll компилить с /MT?
От: VTT http://vtt.to
Дата: 02.03.15 12:55
Оценка: +2
Здравствуйте, vkalitkin, Вы писали:

O>>А версии dll точно совпадают (те, которые подкладываются ручками и те, которые ставит vcredist.exe) ?


V>Совпадают. Но дело похоже в другом.


V>я подкладывал в виде


V>..\AppFolder\AppName.exe

V>..\AppFolder\msvcp120.dll
V>..\AppFolder\msvcr120.dll

V>а надо было в виде


V>..\AppFolder\AppName.exe

V>..\AppFolder\Microsoft.VC120.CRT\msvcp120.dll
V>..\AppFolder\Microsoft.VC120.CRT\msvcr120.dll

V>Позже поэксперементирую еще на разных системах.


А вы не пробовали смотреть ваши exe и dll в dependency walker? Вдруг они требуют еще каких-либо dll помимо с и с++ рантайма, например рантайм OpenMP vcomp120.dll или еще что-нибудь.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[7]: Допустимо ли dll компилить с /MT?
От: Mr.Delphist  
Дата: 02.03.15 14:22
Оценка: +1
Здравствуйте, VTT, Вы писали:

VTT>А вы не пробовали смотреть ваши exe и dll в dependency walker? Вдруг они требуют еще каких-либо dll помимо с и с++ рантайма, например рантайм OpenMP vcomp120.dll или еще что-нибудь.


Да и вообще это полезная привычка — смотреть dependency walker. Ибо рантайм — тоже человек, и тоже может хотеть что-то подгрузить (иногда delayed). Так что, понимание всего dependency tree здорово облегчает жизнь.
Re[6]: Допустимо ли dll компилить с /MT?
От: okman Беларусь https://searchinform.ru/
Дата: 02.03.15 17:01
Оценка:
Здравствуйте, vkalitkin, Вы писали:

V>а надо было в виде


V>..\AppFolder\AppName.exe

V>..\AppFolder\Microsoft.VC120.CRT\msvcp120.dll
V>..\AppFolder\Microsoft.VC120.CRT\msvcr120.dll

Что-то я сомневаюсь, что это прокатит. В Visual C++ манифесты не используются еще с VS2010,
поэтому необходимости в таких путях нету. Другое дело, что там еще Qt используется, OpenSSL и т.п.,
то есть, сторонние библиотеки, у которых могут быть свои особые "заморочки"...
Re: Допустимо ли dll компилить с /MT?
От: B0FEE664  
Дата: 11.03.15 15:29
Оценка:
Здравствуйте, vkalitkin, Вы писали:

V>Есть exe + dll (Qt, OpenSSl + другие) которые скомпилены с /MD, для работы они требуют установки рантайма VS2013, возможно ли все dll скомпилить с /MT чтобы рантайма не требовали? Или от того что в каждой dll/exe будет отдельный менеджер памяти возникнут проблемы? В итоге хотел бы получить чисто Portable вариант программы который работает сразу с флешки на любой винде от XP/Win2003 и далее


А что мешает сделать статическую линковку? Лицензионные проблемы?
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.