Difference between revisions of "Compiling under VS2008:ru"

From Valve Developer Community
Jump to: navigation, search
 
(Забыл добавить "в линкуемые вместе с модом")
 
(10 intermediate revisions by 7 users not shown)
Line 1: Line 1:
В этом туториале вы научитесь как использовать [[Source SDK]] для компилирования в '''Visual Studio 2008''' and '''Visual C++ Express 2008'''. Сначала создайте свой мод.
+
{{otherlang2
 +
|title=Компиляция под VS2008
 +
| en = Compiling under VS2008}}
  
{{note|'''Для работы не надо устанавливать Microsoft Platform SDK, все нужные файлы включены в VC2008.}}
+
{{toc-right}}
  
{{note|You will still encounter occasional "precompiled header skipped" warnings after following this guide. Don't worry, they're harmless!}}
+
В этой статье вы узнаете как получить [[Source SDK:ru|Source SDK]] для компиляции под '''Visual Studio 2008''' и/или '''Visual C++ Express 2008'''. Есть несколько вещей, которые вам необходимо сделать для начала работы. Прежде чем начать, [[Create a Mod:ru|создайте ваш мод]].
  
== Обновление до Service Pack 1 ==
+
{{warning:ru|Предполагается, что вы компилируете последнюю версию исходного кода Orange Box.}}
  
Если вы установили VS2008 до Августа 2008 года, то вам надо поставить SP1. Service pack установится автоматически через Windows Update, но вы можете это сделать сами. Для начала скачайте это:
+
{{tip:ru|Вам ''не'' требуется устанавливать Platform SDK. VS2008 и VCE2008 включают в себя все необходимое.}}
  
* [http://www.microsoft.com/downloads/details.aspx?FamilyId=FBEE1648-7106-44A7-9649-6D9F6D58056E Visual Studio update]
+
{{note:ru|Иногда вы будете сталкиваться с предупреждением "precompiled header skipped". Это нормально.}}
* [http://www.microsoft.com/downloads/details.aspx?FamilyId=F3FBB04E-92C2-4701-B4BA-92E26E408569 Visual C++ Express update] (выберите vcsetup.exe)
 
  
Service Pack 1 исправляет ошибки в отчетах и ошибки при работе с базой данных Intellisense.
+
== Установка Visual Studio 2008 ==
  
== Обновление файла проекта ==
+
Если у вас нет Visual Studio 2008, вы можете бесплатно [http://www.microsoft.com/express/download/ получить Visual C++ Express 2008] от Microsoft.
  
Visual Studio обновит файл проекта. Если вы будете работать в прошлых версиях VS, то сделайте резервную копию файла проекта.
+
=== Обновление до Service Pack 1 ===
  
{{tip|Для удобства вы можете переименовать файл проекта с <code>whatever_2005.sln</code> на <code>whatever_2008.sln</code>.}}
+
Если вы установили VS2008 до Августа 2008 года, вам необходимо установить SP1. Service Pack скачивается через Windows Update, однако на данный момент, требуется ручная загрузка:
  
== Исправление падения при компиляции ==
+
* [http://www.microsoft.com/downloads/details.aspx?FamilyId=FBEE1648-7106-44A7-9649-6D9F6D58056E обновление Visual Studio]
 +
* [http://www.microsoft.com/downloads/details.aspx?FamilyId=F3FBB04E-92C2-4701-B4BA-92E26E408569 обновление Visual C++ Express] (выберите vcsetup.exe)
  
VS2008 "падает" на '''строке 348''' ([[Orange box|OB]] код) в файле <code>client/c_vguiscreen.cpp</code> ([http://developer.valvesoftware.com/cgi-bin/bugzilla/show_bug.cgi?id=214 отчет об ошибке здесь]):
+
Service Pack 1 улучшает отчеты об ошибках и исправляет ошибки при работе с базой данных Intellisense, остальные улучшения не имеют прямого отношения к Source SDK.
 
dist = c_x / tan( M_PI * scaled_fov / 360.0 );
 
  
Замените это на:
+
{{warning:ru|Если вы получаете ошибки, наподобие:
 +
error C2471: cannot update program database
 +
fatal error C1083: Cannot open program database file
 +
с не измененным исходным кодом, это означает, что вы должны установить SP1!}}
  
float dist_denom = tan( M_PI * scaled_fov / 360.0f );
+
== Открытие солюшена ==
dist = c_x / dist_denom;
 
  
== Исправление ошибки при копировании файлов ==
+
# Запустите вашу копию '''Microsoft Visual Studio'''.
 +
# Выберите '''File-&gt;Open Solution''' из меню и откройте солюшен '''Game_Episodic-2005.sln''' расположенный в директории <code>src</code> вашего мода, выберите тот, который соответствует вашей версии '''Microsoft Visual Studio'''. Заметьте, что часть имени файла с "HL2" будет соответствовать выбранному вами моду в процессе создания. Если вы создали мод через Scratch, "Scratch" появится там же.
  
Правой кнопкой > Свойства проектов Server и Client. Вам надо сделать это для конфигураций Release и Debug; четыре раза всего.
+
=== Обновления файлов проекта ===
  
# Выберите ''Configuration Properties > Custom Build Step''.
+
Если вы работали над вашим модом в предыдущих версиях VS, Visual Studio предложит вам обновить файлы проекта и возможно, вы захотите, чтобы была сделана резервная копия проекта, резервную копию необходимо делать вручную, иначе, вы потеряете старую версию навсегда.
# Нажмите на ''Command Line'', затем нажмите на кнопку ... расположенная справа от поля ввода.
 
# Замените содержимое диалога на первый блок кода (под Command Line).
 
# Нажмите на ''Outputs'' и вставте второй блок кода (под Outputs).
 
  
{{warning|Незабудте заменить "client" на "server" в проекте Server и <YOUR MOD PATH> замените на оригинальное месторасположение мода.}}
+
{{tip:ru|Для удобства вы можете переименовать файл проекта с <code>whatever_2005.sln</code> на <code>whatever_2008.sln</code>.}}
  
=== Command Line ===
+
== Исправление отладочной компиляции ==
  
if exist "<YOUR MOD PATH>\bin\client.dll" attrib -r "<YOUR MOD PATH>\bin\client.dll"
+
{{tip:ru|Нет необходимости компилировать отладочную версию благодаря PDB файлам, создаваемым Visual Studio в режиме релиза. Однако вы заметите, что в редких случаях при использовании PDB переменные расшифровываются не правильно. Вы так же можете не использовать Valve код <code>#ifdef DEBUG</code>. Вам решать: отладочные версии более медленные и большие, нежели финальные сборки.}}
copy "$(TargetDir)"client.dll "<YOUR MOD PATH>\bin\"
 
if exist "<YOUR MOD PATH>\bin\client.pdb" attrib -r "<YOUR MOD PATH>\bin\client.pdb"
 
if exist "$(TargetDir)"client.pdb copy "$(TargetDir)"client.pdb "<YOUR MOD PATH>\bin\"
 
  
=== Outputs ===
+
Правый-Клик > Properties на проектах Server и Client (выделите их оба). Убедившись, что вы работаете в режиме отладки (Debug) (верхний левый угол в диалоге настроек - возможно, вам сперва понадобится выбрать пункт Configuration Properties в списке слева) измените ''Configuration Properties > Linker > Input > Ignore Specific Library'' на '''<code>libc;libcd;libcmtd</code>''' (дополнительно 'd' на конце).
  
<YOUR MOD PATH>\bin\client.dll;<YOUR MOD PATH>\bin\client.pdb
+
Эта функция также нуждается в закомментировании '''линии 727''' ([[Orange box|OB]] код) в <code>server/memoverride.cpp</code>:
  
 +
<source lang=cpp>
 +
void __cdecl _invalid_parameter_noinfo(void)
 +
{
 +
    Assert(0);
 +
}
 +
</source>
  
''Если ошибки не исправлены вы не получите бинарный файл в папке bin вашего мода в steam, удалите мод и перекомпилируйте или создйте заново свой проект.''
+
Можете удалить эту часть. Так же не забудьте запустить ваш мод с параметром <code>-allowdebug</code>!
  
== Исправление ошибки при компиляции в режиме debug ==
+
== Исправление отсутствующих символов ==
  
Правой кнопкой > Properties на Server и Client проектах. Проверьте что вы используйте debug режим копиляции:
+
Если вы видите, что отсутствуют такие символы, как: ConVar_Register вам необходимо добавить tier3.lib в линкуемые вместе с модом статические библиотеки.
  
# Измените ''Configuration Properties > C/C++ > General > Debug Information Format'' на '''<code>Program Database (/Zi)</code>'''.
+
== Отключение /Wp64 ==
# Измените ''Configuration Properties > C/C++ > Code Generation > Runtime Library'' на '''<code>Multi-threaded (/MT)</code>'''.
 
# Измените ''Configuration Properties > Linker > Input > Ignore Specific Library'' на '''<code>libc;libcd;libcmtd</code>'''.
 
  
Теперь надо закомментировать функцию на '''строке 727''' ([[Orange box|OB]] код) файла <code>server/memoverride.cpp</code>:
+
Вы будете получать предупреждения о <code>Wp64</code>. Вы можете игнорировать их, но если они вам мешают, то сделайте следующее: правый-клик > Properties на Server и Client проектах, затем измените ''Configuration Properties > C/C++ > General > Detect 64-bit Portability Issues'' на '''<code>No</code>'''.
  
void __cdecl _invalid_parameter_noinfo(void)
+
== Установка DirectX SDK (для шейдеров) ==
{
 
    Assert(0);
 
}
 
  
Запомните! Запускайте мод с параметром <code>-allowdebug</code>
+
Чтобы создать новый [[shader|шейдер]], вам нужен [http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=24a541d6-0486-4453-8641-1eee9e21b282 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 ' без кавычек.
 +
# Повторите эти шаги для сервера.
  
Если вы заметили пропущенные символы в: ConVar_Register вам нужно добавить tier3.lib в папку Link Libraries.
+
== Missing vc80.pdb ==
  
== Отключить /Wp64 ==
+
Вы можете столкнутся с этими предупреждениями после попытки компиляции с одним из внедряемых в SDK инструментов/библиотек. Вы видите это, т.к. ваш код был компилирован в VS2008 (VC9), в то время как SDK .libs были откомпилированы в VS2005 (VC8).
  
Если вы видите предупреждения об опции <code>Wp64</code>. ВЫ можете проигнорировать это, но если вам не нравится то сделайте следующее: Правой кнопкой > Properties проектов Server и Client, затем измените ''Configuration Properties > C/C++ > General > Detect 64-bit Portability Issues'' на '''<code>No</code>'''.
+
Предупреждения не допускают компиляцию PDB файлов. Простейший способ исправления этой проблемы - компиляции библиотеки, которая создает их сама!
  
== Исправлении ошибки "missing CTeamTrainWatcher" ==
+
== Исправление grenade_tripmine.cpp ==
  
В многопользовательском режиме Orange Box у проекта client нет некоторых файлов. Компиляция произойдет, но карта не загрузится. Однопользовательские моды не реагируют на это.  
+
Если запустили код hl2mp и получили ошибку <code>C2039: 'OnTakeDamage_Alive' : is not a member of 'CBaseGrenade'</code>, перейдите к '''линии 31''' в <code>shared/basegrenade_shared.h</code>:
  
'''Solution: '''
+
<source lang="cpp">
* В Visual Studio, нажмите правой кнопкой на Source Files Folder в проекте Client
+
//Tony; Compromise! in episodic single player, inherit CBaseCombatCharacter for the barnacle interaction, otherwise this will never get called.
* Выберите add existing
+
class CBaseGrenade :  
* Выберите '''c_team_train_watcher.h''' и '''c_team_train_watcher.cpp'''
+
#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 );
 +
</source>
  
Смотрите [[Error on map: "Client missing DT class CTeamTrainWatcher"]] для большей информации об этой проблеме.
+
Замените это на:
 
+
<source lang="cpp">
== Установка DirectX SDK (для шейдеров) ==
+
  //Tony; Compromise! in episodic single player, inherit CBaseCombatCharacter for the barnacle interaction, otherwise this will never get called.
 
+
class CBaseGrenade :
Чтобы создать новый [[шейдер]] вам нужен [http://go.microsoft.com/fwlink/?LinkID=112184&clcid=0x409 MS DirectX SDK (March 2008)]. После установки следуйте инструкции для внедрения в проект.
+
#if defined( HL2_EPISODIC ) || defined ( HL2MP )
 
+
public CBaseCombatCharacter
# Выберите Options: Projects and Solutions - VC++ Directories
+
#else
# Выберите "Include files" и добавьте "...\Microsoft DirectX SDK (March 2008)\Include"
+
public CBaseAnimating
# ВЫберите "Library files" и добавьте "...\Microsoft DirectX SDK (March 2008)\Lib\x86"
+
#endif
# В Solution Explorer нажмите правой кнопкой на 'client_hl2', и выберите Properties.
+
#if defined( GAME_DLL )
# В окне свойств client_hl2, выберите Linker - Input
+
, public CDefaultPlayerPickupVPhysics
# Выберите 'Additional Properties' и нажмите на '...'
+
#endif
# Если тут есть данные, пропустите линию, и введите ' user32.lib ' без кавычек.
+
{ //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
 +
</source>
  
[[Category:Tutorials]]
+
[[Category:Tutorials:ru]]
[[Category:Programming]]
+
[[Category:Programming:ru]]
 +
[[Category:Source SDK FAQ:ru]]
 +
[[Category:Russian]]

Latest revision as of 08:11, 24 November 2016

English

В этой статье вы узнаете как получить Source SDK для компиляции под Visual Studio 2008 и/или Visual C++ Express 2008. Есть несколько вещей, которые вам необходимо сделать для начала работы. Прежде чем начать, создайте ваш мод.


Предупреждение:Предполагается, что вы компилируете последнюю версию исходного кода Orange Box.
Совет:
Вам не требуется устанавливать Platform SDK. VS2008 и VCE2008 включают в себя все необходимое.


Примечание:Иногда вы будете сталкиваться с предупреждением "precompiled header skipped". Это нормально.

Установка Visual Studio 2008

Если у вас нет Visual Studio 2008, вы можете бесплатно получить Visual C++ Express 2008 от Microsoft.

Обновление до Service Pack 1

Если вы установили VS2008 до Августа 2008 года, вам необходимо установить SP1. Service Pack скачивается через Windows Update, однако на данный момент, требуется ручная загрузка:

Service Pack 1 улучшает отчеты об ошибках и исправляет ошибки при работе с базой данных Intellisense, остальные улучшения не имеют прямого отношения к Source SDK.


Предупреждение:Если вы получаете ошибки, наподобие:
error C2471: cannot update program database
fatal error C1083: Cannot open program database file
с не измененным исходным кодом, это означает, что вы должны установить SP1!

Открытие солюшена

  1. Запустите вашу копию Microsoft Visual Studio.
  2. Выберите File->Open Solution из меню и откройте солюшен Game_Episodic-2005.sln расположенный в директории src вашего мода, выберите тот, который соответствует вашей версии Microsoft Visual Studio. Заметьте, что часть имени файла с "HL2" будет соответствовать выбранному вами моду в процессе создания. Если вы создали мод через Scratch, "Scratch" появится там же.

Обновления файлов проекта

Если вы работали над вашим модом в предыдущих версиях VS, Visual Studio предложит вам обновить файлы проекта и возможно, вы захотите, чтобы была сделана резервная копия проекта, резервную копию необходимо делать вручную, иначе, вы потеряете старую версию навсегда.

Совет:
Для удобства вы можете переименовать файл проекта с whatever_2005.sln на whatever_2008.sln.


Исправление отладочной компиляции

Совет:
Нет необходимости компилировать отладочную версию благодаря PDB файлам, создаваемым Visual Studio в режиме релиза. Однако вы заметите, что в редких случаях при использовании PDB переменные расшифровываются не правильно. Вы так же можете не использовать Valve код #ifdef DEBUG. Вам решать: отладочные версии более медленные и большие, нежели финальные сборки.


Правый-Клик > Properties на проектах Server и Client (выделите их оба). Убедившись, что вы работаете в режиме отладки (Debug) (верхний левый угол в диалоге настроек - возможно, вам сперва понадобится выбрать пункт Configuration Properties в списке слева) измените Configuration Properties > Linker > Input > Ignore Specific Library на libc;libcd;libcmtd (дополнительно 'd' на конце).

Эта функция также нуждается в закомментировании линии 727 (OB код) в 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). После установки следуйте инструкциям ниже, чтобы внедрить его в ваш проект.

  1. Перейдите в Tools - Options: Projects and Solutions - VC++ Directories.
  2. Выберите "Include files" и добавьте "...\Microsoft DirectX SDK (November 2008)\Include".
  3. Выберите "Library files" и добавьте "...\Microsoft DirectX SDK (November 2008)\Lib\x86".
  4. В Solution Explorer нажмите правой кнопкой мыши на 'client_hl2', и выберите Properties.
  5. В окне настроек client_hl2 выберите Linker - Input.
  6. Выберите 'Additional Properties' и кликните на '...' справа.
  7. Если здесь уже есть запись, создайте новую запись после нее (пробела будет достаточно, если вы не сможете создать новую линию), и напишите ' user32.lib ' без кавычек.
  8. Повторите эти шаги для сервера.

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