Free Compiler Setup

From OrbiterWiki
Jump to navigation Jump to search

This page documents the travails and heartache necessary to get the MSVC++ 2005 Express Edition to compile Orbiter projects.

Get the Compiler

Go to the Microsoft download center and get the compiler.

Tell the program you are agreeing to its pernicious license agreement, but do it with your fingers crossed.

Get the Graphical IDE, but not MSDN or SQL stuff.

Get Orbiter and the SDK

Get Orbiter and the OrbiterSDK from Orbitersim.com and unpack it. You need at least 4 files:

  1. Orbiter Base (050116)
  2. Orbiter SDK (050116)
  3. Orbiter Base Patch (050216)
  4. Orbiter SDK Patch (050216)

Unpack all these files into the same folder, in order. A good choice is C:\Orbiter. This document assumes you use this path, from now on.

When installing the patches, it will if it is ok to replace a file. Say yes to all.

Get the Windows SDK

You need the SDK to get windows.h and its associated files.

Go to here to get the Windows Platform SDK. It says it is the Windows 2003 Server SDK but it includes what we want. Run the installer and uncheck everything but what is shown below.

SDKInstall1.png

Setting up a project

VC++ 2003 files are not perfectly compatible with VC++ 2005, and the non-free version is not perfectly compatible with the free version. There are several changes that you need to make to the project to get it to compile. Fortunately, they are small, and the same for all projects.

We will modify the ShuttlePB project to work with the VC++2005. Start VC++, and open the project file OrbiterSDK\samples\ShuttlePB\ShuttlePB.dsw.

Configuration

At the top, immediately under the menu bar, change the Configuration to Release.

SDKInstall2.png

Include path

Add the SDK include path for both the Platform SDK and the Orbiter SDK to the project include path. The Platform SDK installs itself by default to C:\Program Files\Microsoft Platform SDK so add the path C:\Program Files\Microsoft Platform SDK\Include. Orbiter can be installed anywhere, but if you unpacked it to C:\Orbiter, the correct path is C:\Orbiter\Orbitersdk\include. Or, you can have it be a relative path, like ..\..\include (This number of ..\ is correct for ShuttlePB, check for the right number for anyplace else)

SDKInstall3.png

Library path

Add the SDK library path for both the Platform SDK and the Orbiter SDK to the linker library path. The Platform SDK path default is C:\Program Files\Microsoft Platform SDK\lib. The Orbiter SDK default is C:\Orbiter\Orbitersdk\lib

SDKInstall5.png

C++ language change

MSVC++ 2005 uses a slightly different standard of C++ than Orbiter is used to. Fortunately, this is a very slight change.

First, load OrbiterAPI.h and change the reference to <fstream.h> to <fstream>

If you were to build the project now, it would break on line 43 of ShuttlePB.cpp. Simply change the function as shown.

// Calculate lift coefficient [Cl] as a function of aoa (angle of attack) over -Pi ... Pi
// Implemented here as a piecewise linear function
double LiftCoeff (double aoa)
{
	const int nlift = 9;
	static const double AOA[nlift] = {-180*RAD,-60*RAD,-30*RAD,-1*RAD,15*RAD,20*RAD,25*RAD,60*RAD,180*RAD};
	static const double CL[nlift]  = {       0,      0,   -0.1,     0,   0.2,  0.25,   0.2,     0,      0};
	static const double SCL[nlift] = {(CL[1]-CL[0])/(AOA[1]-AOA[0]), (CL[2]-CL[1])/(AOA[2]-AOA[1]),
		                          (CL[3]-CL[2])/(AOA[3]-AOA[2]), (CL[4]-CL[3])/(AOA[4]-AOA[3]),
					  (CL[5]-CL[4])/(AOA[5]-AOA[4]), (CL[6]-CL[5])/(AOA[6]-AOA[5]), 
 	                                  (CL[7]-CL[6])/(AOA[7]-AOA[6]), (CL[8]-CL[7])/(AOA[8]-AOA[7])};
	for (int i = 0; i < nlift-1 && AOA[i+1] < aoa; i++);
       int i;
	for (i = 0; i < nlift-1 && AOA[i+1] < aoa; i++);
	return CL[i] + (aoa-AOA[i])*SCL[i];
}

The exact problem here is that in VC++2003, the variable i in the one-line for statement for(int i=0... has scope over its entire block, in this case the entire function. In VC++2005, i only has scope over the for statement. Other projects may break in the compile phase for similar reasons.

There is an option in the project compiler settings window which changes this particular standard, but I happen to think that the code change makes the code clearer and more readable. I have not tested if the compiler setting works.

Adding and Removing libraries

Compiling a vessel requires the Windows SDK library kernel32.lib. This one is always compiled into Win32 projects by default. Compiling MFDs also require the Windows SDK libraries user32.lib and gdi32.lib. These are not compiled in by default, so you have to add them to the "Additional Dependencies" line.

Believe it or not, the project demands weird stuff like ODBC support by default. Why would a vessel ever need to use a database? This is easy to remove. Just take the odbc libraries out of the "Additional Dependencies" line. Also, by default, the project tries to link against the library msvcirt.lib which is not included in the free VC++2005 download, or the SDK download. We can easily get rid of this also. Add this library to the "Ignore specific library" line.

Edit the project properties, and make the changes as shown below:

SDKInstall4.png

Compiling the addon

Use the menu option Build/Build ShuttlePB to compile. It should now compile cleanly, no errors or warnings. The DLL will be in C:\Orbiter\Orbitersdk\samples\ShuttlePB\Release\ShuttlePB.dll. You should be able to copy this DLL to the C:\Orbiter\Modules folder, then load any scenario which uses ShuttlePB and fly it normally.

To Do

  • Check if this compiles MFDs
  • Check if this compiles vessels with panels