Ru/Compiling under VS2008

В этой статье вы узнаете как получить для компиляции под Visual Studio 2008 и/или Visual C++ Express 2008. Есть несколько вещей, которые вам необходимо сделать для начала работы. Прежде чем начать, .
== Установка Visual Studio 2008 ==
Если у вас нет Visual Studio 2008, вы можете бесплатно получить Visual C++ Express 2008 от Microsoft.
=== Обновление до Service Pack 1 ===
Если вы установили VS2008 до Августа 2008 года, вам необходимо установить SP1. Service Pack скачивается через Windows Update, однако на данный момент, требуется ручная загрузка:
* обновление Visual Studio
* обновление Visual C++ Express (выберите vcsetup.exe)
Service Pack 1 улучшает отчеты об ошибках и исправляет ошибки при работе с базой данных Intellisense, остальные улучшения не имеют прямого отношения к Source SDK.
== Открытие солюшена ==
# Запустите вашу копию Microsoft Visual Studio.
# Выберите File->Open Solution из меню и откройте солюшен Game_Episodic-2005.sln расположенный в директории src вашего мода, выберите тот, который соответствует вашей версии Microsoft Visual Studio. Заметьте, что часть имени файла с "HL2" будет соответствовать выбранному вами моду в процессе создания. Если вы создали мод через Scratch, "Scratch" появится там же.
=== Обновления файлов проекта ===
Если вы работали над вашим модом в предыдущих версиях VS, Visual Studio предложит вам обновить файлы проекта и возможно, вы захотите, чтобы была сделана резервная копия проекта, резервную копию необходимо делать вручную, иначе, вы потеряете старую версию навсегда.
== Исправление отладочной компиляции ==
Правый-Клик > Properties на проектах Server и Client (выделите их оба). Убедившись, что вы работаете в режиме отладки (Debug) (верхний левый угол в диалоге настроек - возможно, вам сперва понадобится выбрать пункт Configuration Properties в списке слева) измените Configuration Properties > Linker > Input > Ignore Specific Library на libc;libcd;libcmtd (дополнительно 'd' на конце).
Эта функция также нуждается в закомментировании линии 727 ( код) в server/memoverride.cpp:
void __cdecl _invalid_parameter_noinfo(void)
{
 Assert(0);
}
Можете удалить эту часть. Так же не забудьте запустить ваш мод с параметром -allowdebug!
== Исправление отсутствующих символов ==
Если вы видите, что отсутствуют такие символы, как: ConVar_Register вам необходимо добавить tier3.lib в линкуемые вместе с модом статические библиотеки.
== Отключение /Wp64 ==
Вы будете получать предупреждения о Wp64. Вы можете игнорировать их, но если они вам мешают, то сделайте следующее: правый-клик > Properties на Server и Client проектах, затем измените Configuration Properties > C/C++ > General > Detect 64-bit Portability Issues на No.
== Установка DirectX SDK (для шейдеров) ==
Чтобы создать новый , вам нужен MS DirectX SDK (Март 2009). После установки следуйте инструкциям ниже, чтобы внедрить его в ваш проект.
# Перейдите в Tools - Options: Projects and Solutions - VC++ Directories.
# Выберите "Include files" и добавьте "...\Microsoft DirectX SDK (November 2008)\Include".
# Выберите "Library files" и добавьте "...\Microsoft DirectX SDK (November 2008)\Lib\x86".
# В Solution Explorer нажмите правой кнопкой мыши на 'client_hl2', и выберите Properties.
# В окне настроек client_hl2 выберите Linker - Input.
# Выберите 'Additional Properties' и кликните на '...' справа.
# Если здесь уже есть запись, создайте новую запись после нее (пробела будет достаточно, если вы не сможете создать новую линию), и напишите ' user32.lib ' без кавычек.
# Повторите эти шаги для сервера.
== Missing vc80.pdb ==
Вы можете столкнутся с этими предупреждениями после попытки компиляции с одним из внедряемых в SDK инструментов/библиотек. Вы видите это, т.к. ваш код был компилирован в VS2008 (VC9), в то время как SDK .libs были откомпилированы в VS2005 (VC8).
Предупреждения не допускают компиляцию PDB файлов. Простейший способ исправления этой проблемы - компиляции библиотеки, которая создает их сама!
== Исправление grenade_tripmine.cpp ==
Если запустили код hl2mp и получили ошибку C2039: 'OnTakeDamage_Alive' : is not a member of 'CBaseGrenade', перейдите к линии 31 в shared/basegrenade_shared.h:
 //Tony; Compromise! in episodic single player, inherit CBaseCombatCharacter for the barnacle interaction, otherwise this will never get called.
 class CBaseGrenade : 
 	#if defined( HL2_EPISODIC )
 		public CBaseCombatCharacter
 	#else
 		public CBaseAnimating
 	#endif
 	#if defined( GAME_DLL )
 		, public CDefaultPlayerPickupVPhysics
 	#endif
 {		//Tony; the ugliest class definition ever, but it saves characters, or something. Should I be shot for this?
 	DECLARE_CLASS( CBaseGrenade, CBaseAnimating );
Замените это на:
 //Tony; Compromise! in episodic single player, inherit CBaseCombatCharacter for the barnacle interaction, otherwise this will never get called.
 class CBaseGrenade : 
 	#if defined( HL2_EPISODIC ) || defined ( HL2MP )
 		public CBaseCombatCharacter
 	#else
 		public CBaseAnimating
 	#endif
 	#if defined( GAME_DLL )
 		, public CDefaultPlayerPickupVPhysics
 	#endif
 {		//Tony; the ugliest class definition ever, but it saves characters, or something. Should I be shot for this?
	#if defined( HL2_EPISODIC ) || defined ( HL2MP )
 		DECLARE_CLASS( CBaseGrenade, CBaseCombatCharacter);
	#else
 		DECLARE_CLASS( CBaseGrenade, CBaseAnimating );
	#endif
Category:Russian