Есть exe + dll (Qt, OpenSSl + другие) которые скомпилены с /MD, для работы они требуют установки рантайма VS2013, возможно ли все dll скомпилить с /MT чтобы рантайма не требовали? Или от того что в каждой dll/exe будет отдельный менеджер памяти возникнут проблемы? В итоге хотел бы получить чисто Portable вариант программы который работает сразу с флешки на любой винде от XP/Win2003 и далее
Еще как вариант — в документации написано что можно подкладывать рантайм локально в ту же папку что exe (msvcp120.dll msvcr120.dll vccorlib120.dll), но на практике почему то не получается, программа запускается и зависает. Я помню это работало в VS2008, но в более поздних уже нет. Может кто знает что еще нужно сделать кроме подкладывания этих dll?
Здравствуйте, vkalitkin, Вы писали:
V>Есть exe + dll (Qt, OpenSSl + другие) которые скомпилены с /MD, для работы они требуют установки рантайма VS2013, возможно ли все dll скомпилить с /MT чтобы рантайма не требовали? Или от того что в каждой dll/exe будет отдельный менеджер памяти возникнут проблемы? В итоге хотел бы получить чисто Portable вариант программы который работает сразу с флешки на любой винде от XP/Win2003 и далее
Да, можно. Если всё будет собрано одним компилятором, то проблем не будет. Но это тот ещё геморрой.
Да и если цель сделать полностью транспортабельную версию, то можно все нужные dll положить рядом, и написать правильный manifest. На мой взгляд это будет на много проще.
F>Да и если цель сделать полностью транспортабельную версию, то можно все нужные dll положить рядом, и написать правильный manifest. На мой взгляд это будет на много проще.
А не могли бы вы привести пример правильного манифеста для портабельной версии?
Здравствуйте, vkalitkin, Вы писали:
F>>Да и если цель сделать полностью транспортабельную версию, то можно все нужные dll положить рядом, и написать правильный manifest. На мой взгляд это будет на много проще.
V>А не могли бы вы привести пример правильного манифеста для портабельной версии?
Здравствуйте, fdn721, Вы писали:
F>Да, можно. Если всё будет собрано одним компилятором, то проблем не будет.
Это неправильно. /MT для динамической библиотеки допустимо только в том случае, когда между вызывающим кодом и динамической библиотекой не передаются объекты классов, а освобождение памяти происходит в том же модуле, в котором она была выделена.
Здравствуйте, vkalitkin, Вы писали:
V>Еще как вариант — в документации написано что можно подкладывать рантайм локально в ту же папку что exe (msvcp120.dll msvcr120.dll vccorlib120.dll), но на практике почему то не получается, программа запускается и зависает. Я помню это работало в VS2008, но в более поздних уже нет. Может кто знает что еще нужно сделать кроме подкладывания этих dll?
В VS2005 и VS2008 нужна была магия с манифестами.
В VS2010 и выше манифесты для Visual C/C++ Runtime не используются, так что
должно работать простым копированием msvcpXX.dll и msvcrXX.dll
(сам много раз так делал).
Здравствуйте, ArtDenis, Вы писали:
AD>Это неправильно. /MT для динамической библиотеки допустимо только в том случае, когда между вызывающим кодом и динамической библиотекой не передаются объекты классов, а освобождение памяти происходит в том же модуле, в котором она была выделена.
O>должно работать простым копированием msvcpXX.dll и msvcrXX.dll O>(сам много раз так делал).
Ну вот увы не работает.
Если без них — пишет что такие dll не найдены.
Если их просто в локальный каталог добавить — то зависает при запуске (в процессах висит, но окно не появляется).
Если установить рантайм — то все сразу работает как надо.
Потому у меня подозрения что установщик VS2013 рантайма что то еще делает кроме копирования dll, может в реестре что прописывает или еще какие дополнительные файлы устанавливает.
Здравствуйте, 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 или еще что-нибудь.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, VTT, Вы писали:
VTT>А вы не пробовали смотреть ваши exe и dll в dependency walker? Вдруг они требуют еще каких-либо dll помимо с и с++ рантайма, например рантайм OpenMP vcomp120.dll или еще что-нибудь.
Да и вообще это полезная привычка — смотреть dependency walker. Ибо рантайм — тоже человек, и тоже может хотеть что-то подгрузить (иногда delayed). Так что, понимание всего dependency tree здорово облегчает жизнь.
Здравствуйте, 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 и т.п.,
то есть, сторонние библиотеки, у которых могут быть свои особые "заморочки"...
Здравствуйте, vkalitkin, Вы писали:
V>Есть exe + dll (Qt, OpenSSl + другие) которые скомпилены с /MD, для работы они требуют установки рантайма VS2013, возможно ли все dll скомпилить с /MT чтобы рантайма не требовали? Или от того что в каждой dll/exe будет отдельный менеджер памяти возникнут проблемы? В итоге хотел бы получить чисто Portable вариант программы который работает сразу с флешки на любой винде от XP/Win2003 и далее
А что мешает сделать статическую линковку? Лицензионные проблемы?