Форум программистов, компьютерный форум CyberForum.ru

Visual C++

Войти
Регистрация
Восстановить пароль
 
 
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
#1

Правильное создание релизной версии проекта в Visual Studio - Visual C++

04.05.2013, 09:48. Просмотров 17980. Ответов 15
Метки нет (Все метки)

Салют!
Уже долгое время бьюсь над проблемой, когда созданный на одном компьютере проект не работает на другом. Все длл я собрал в папку с программой, но дело в том, что эти самые длл ищутся сначала в системных папках, и, если там найдена таковая, используют ее. А версии длл'ек часто различаются. Нет ли способа каким-либо образом вручную указать, какие именно длл и откуда их необходимо проверять в первую очередь?
В частности, с переносом с win7 на win7 вроде разобрался (в настройках режим \MT поставил, и на парочке проверенных это работает), но вот при попытке запустить на XP уже возникают проблемы (хотя это как раз таки самый актуальный вопрос)...

P.s.
1. Хотелось бы обойтись без установки redist на этом компе;

2. Недавно встретил такую программу, как ILMerge, для сборки exe и всех длл'ек в один файл, но походу она конкретно в этом случае не подходит (проверено). Может, есть какие-либо аналоги именно для программы, написанной на VS?

Спасибо.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2013, 09:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Правильное создание релизной версии проекта в Visual Studio (Visual C++):

Visual Studio 2010 (создание проекта) - Visual C++
Кто пользовался Microsoft Visual Studio 2010??? Кто там создавал MFC Application? У меня такая проблема, начинаю создавать, меня...

Создание шаблона проекта visual studio 2005 - Visual C++
Здравствуйте. Необходимо создать шаблон консольного проекта, т.е. например, чтобы при создании проекта у меня в проекте был файл main.cpp...

Преобразование проекта из visual c++ 6.0 в ms visual studio 2010 - Visual C++
Есть проект написанный на visual c++ 6.0. Задача состоит в том, чтобы преобразовать проект в ms visual studio 2010

Установка Visual Studio .NET версии 7.0 - Visual C++
вот хочу поставить и начать изучение. но там слишком много всего мне из пакета надо только Visual C++ и C# а так же чтобы...

Переименование проекта в Visual Studio 6.0 - Visual C++
Проблема в следующем - нужно переименовать проект (со всеми файлами, решениями и т.д.) Кто в этом может помочь? Слышал, что есть...

Visual Studio 2008 и компиляция проекта - Visual C++
Здравствуйте. Пишу программу в Visual Studio 2008 и столкнулся со следующей проблемой. Когда компилирую и запускаю в отладчике то программа...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Убежденный
Системный программист
Эксперт С++
15508 / 7006 / 1106
Регистрация: 02.05.2013
Сообщений: 11,441
Завершенные тесты: 1
04.05.2013, 10:46 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Первое, в чем необходимо убедиться - что программа не использует функции, которые могут
отсутствовать на целевых версиях Windows. Например, InitializeCriticalSectionEx поддерживается,
начиная с Windows Vista, а CreateFile2 вообще есть только на Windows 8 и Windows Server 2012.
Один из способов достичь этого - задавать целевые версии самому, через макроопределения.
Следующий фрагмент разрешает включать из стандартных заголовков SDK только те объявления,
которые имеют смысл для Windows XP (0x0501 - это номер версии NT для Windows XP (5.1), а
0x0600 - это версия Internet Explorer для этой системы, в данном случае шестая):
C
1
2
3
4
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#define _WIN32_WINDOWS 0x0501
#define _WIN32_IE 0x0600
Этот код должен быть включен до любых директив #include. Обычно его выносят в один общий
заголовок с соответствующим названием, например targetver.h (target version).
Теперь при попытке использовать функцию, доступную только на более новых, чем Windows XP,
системах, будет выдана ошибка компиляции.

Это не панацея, но решение 90% проблем данного класса. Хотя некоторые все равно останутся.
Например exe, собранный в Visual C++ 2010, имеет зависимость от функций EncodePointer и
DecodePointer, и поэтому не запустится на Windows Server 2003 RTM (который без R2 и без
сервис-пака), так как на данной системе эти функции отсутствуют. А вот Visual C++ 2008
такой проблемы не имел.

Бывает, что программе, если она запускается на новых системах, нужны некоторые новые
функции, в этом случае следует определять номер версии Windows (GetVersionEx) и
загружать необходимые dll динамически - LoadLibrary/GetProcAddress.
При этом следует учитывать, что программа может быть запущена в режиме совместимости.

Второе - проверить, что программа не имеет зависимостей от dll, которые могут отсутствовать
на целевых системах. Распостраненный случай - отсутствие нужной версии Visual C++ Runtime.
В Visual C++ 2008 рантайм был сделан как SxS-сборки и его нужно было либо включать в инстяллятор
программы, как Merge Module или vcredist.exe, либо делать в каталоге с установленной программой
дополнительную подпапку со специальным именем и помещать сборку туда. В Visual C++ 2010 решение
проблемы упростили и рантайм (msvcr100.dll/msvcp100.dll) теперь подключается, как обычная dll,
без манифестов и прочих сложностей. Хотя вы можете по-прежнему включать в инсталлятор программы
Visual C++ 2010 Redistributable, он просто скопирует файлы рантайма в папку Windows\system32.

Ключ /MT компилятора тоже может помочь, в этом случае рантайм подключается статически и
зависимостей от msvcr100.dll/msvcp100.dll не будет. Хотя данный способ не всегда возможен.

Если проблема остается, можно воспользоваться утилитой Dependency Walker: http://www.dependencywalker.com/
Запускайте ее на проблемной системе и смотрите, каких dll не хватает.

Еще находить проблемы совместимости очень помогает использование виртуальных машин.
Можно сделать себе целый "зоопарк" разных виртуальных систем и конфигураций и перед каждым
релизом софта тестировать его на этих системах.
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
07.05.2013, 19:14  [ТС] #3
спасибо за ответ.
mat_for_c
140 / 135 / 29
Регистрация: 26.04.2013
Сообщений: 660
Завершенные тесты: 2
07.05.2013, 19:47 #4
Если проект пишется на С++ в консоли, то Свойства проекта -> Общие -> Использование MFC -> Использовать MFC в статической библиотеке. Построить проект. Должно работать, я всегда так делаю.
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
07.05.2013, 21:52  [ТС] #5
Дык а причем там MFC то? Я ж его не использую... или я чего-то не понимаю?
mat_for_c
140 / 135 / 29
Регистрация: 26.04.2013
Сообщений: 660
Завершенные тесты: 2
08.05.2013, 20:35 #6
В этом вся и фишка. Почему-то так работает ... Попробуйте и скажите, получится ли у Вас так.
DELAKEY
6 / 6 / 0
Регистрация: 20.11.2013
Сообщений: 246
06.07.2014, 21:22 #7
Убежденный, ключ /MT это тут?
если я тут его выбераю то появляется
Код
Ошибка	1	error D8016: несовместимые параметры командной строки "/clr" и "/MT"	C:\Users\User\documents\visual studio 2013\Projects\LcBotCLR\LcBotCLR\cl	LcBotCLR
Проект с использованием CLR, как исправить не могу ума приложить
Миниатюры
Правильное создание релизной версии проекта в Visual Studio  
Убежденный
Системный программист
Эксперт С++
15508 / 7006 / 1106
Регистрация: 02.05.2013
Сообщений: 11,441
Завершенные тесты: 1
06.07.2014, 22:38 #8
Цитата Сообщение от DELAKEY Посмотреть сообщение
Проект с использованием CLR, как исправить не могу ума приложить
CLR и C++/CLI - это уже не C++ и рекомендации, данные выше, для него не применимы.
sammanta
3 / 3 / 0
Регистрация: 31.05.2015
Сообщений: 52
Завершенные тесты: 1
02.12.2015, 09:41 #9
mat_for_c,
Если проект пишется на С++ в консоли, то Свойства проекта -> Общие -> Использование MFC -> Использовать MFC в статической библиотеке. Построить проект. Должно работать, я всегда так делаю.
Подтверждаю, работает! Под VSC++ проект вынь32 консоль
Zeysithi
0 / 0 / 0
Регистрация: 09.05.2016
Сообщений: 5
10.05.2016, 01:42 #10
ОЧень полезная тема, спасибо)
RAFA91
Заблокирован
19.06.2016, 14:53 #11
Цитата Сообщение от mat_for_c Посмотреть сообщение
Если проект пишется на С++ в консоли, то Свойства проекта -> Общие -> Использование MFC -> Использовать MFC в статической библиотеке. Построить проект. Должно работать, я всегда так делаю.
А если проект Вин Апи 32 визуальный , то что нужно изменять в настройках - что-бы проект запускался на компах где не стоит вижуал 10
sammanta
3 / 3 / 0
Регистрация: 31.05.2015
Сообщений: 52
Завершенные тесты: 1
19.06.2016, 18:37 #12
Все то же самое. Это работает для любых нативных проектов будь то вынь32 или мфк.
Вобще это не работает только для управляемых проектов, т.е. для C++ CLI
RAFA91
Заблокирован
20.06.2016, 11:35 #13
Цитата Сообщение от sammanta Посмотреть сообщение
Все то же самое.

для визуальных вин апи это не подходит. если поставить статику - то получите шыш в компиляции
Leonyk
Заблокирован
30.04.2017, 19:26 #14
не сработало у меня (
Убежденный
Системный программист
Эксперт С++
15508 / 7006 / 1106
Регистрация: 02.05.2013
Сообщений: 11,441
Завершенные тесты: 1
30.04.2017, 19:28 #15
Информативненько.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2017, 19:28
Привет! Вот еще темы с ответами:

Трудности перевода проекта с С на Visual Studio 2005 С++ - Visual C++
Появилась необходимость перевести проект с С на Visual Studio 2005 С++... Появились непонятные ошибки. Если что - не судите строго за...

Ошибка при сборке проекта на Visual Studio 2012(11) - Visual C++
Добрый день! Собираем большой проект на VS2012, который зависит от одной внешней библиотеки .lib. Перед тем, как собрать этот проект,...

Какой тип проекта выбрать в visual studio 2010? - Visual C++
Привет всем. Собираюсь учить Viisual C++, но немного потерялся в типах проекта. Там MFC, ATL, CLR, Win32. Подскажите пожалуйста что для...

Проблемы при компиляции простейшего проекта в Visual Studio - Visual C++
Давно, очень давно не садился за программирование, сегодня решил тряхнуть стариной, написать хотя бы обычную Hello, World!, но что-то пошло...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.04.2017, 19:28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru