Friday, February 3, 2012

Compiling Lua with Visual Studio 2010

Lua?

Lua is a dynamic, object-oriented, interpreted language.  Most programmers are aware of it as the scripting language used in the game World of Warcraft, as well as a number of other games.  However, Lua has been getting a lot of good press lately for a number of reasons.  Last June, Lua entered the Tiobe Index top 10 for the first time.  This winter, it won a Front Line Award from Game Developer’s Magazine.  And most recently, Lua was announced as the official scripting language for Wikipedia, beating out Javascript.

But Lua is also a fascinating language in its own right.  Roberto Ierusalimschy and the others who helped create the language made a number of design decisions which helped create a scripting language that is dynamic and useful, yet also very fast and efficient.  The source code is MIT licensed and compiles in “vanilla” C, so it is a good platform for computer science geeks who want to play around with the internals of a language.   Not to mention the current resurgence of interest in C and C++.

So there has never been a better time to learn a little bit about Lua. 

This post will show how to get started compiling and using Lua using Visual Studio.

At the Lua homepage (http://www.lua.org/  ), you can find a link to a “batteries included” Lua distribution for Windows.  It comes with a number of goodies, and is a worthwhile download.  However, the whole point of Lua is that it is meant to be embedded in other applications.  For this reason you’ll eventually want to compile and work with the Lua source itself.

The example below is based on my experience compiling Lua release 5.2 using Visual Studio 2010 with Visual C++.  If you’re reading this at a much later date, or are using Visual Studio 2008, you may need to adapt it accordingly.  (If you’re reading it at a much earlier date, something has probably gone wrong with the space-time continuum.)

Download Lua

1. Download the desired Lua sources from http://www.lua.org/  At the time of this post, a link to the latest sources can be found at the top of the page:  http://www.lua.org/download.html 

2. The latest release is compressed in gzip (.gz) format; if you don’t already have something that can decompress this, there are a number of utilities available for free or little charge (personally, I prefer 7-Zip).  You can decompress it somewhere as a backup, or else you can decompress it directly after creating a Visual Studio project.

Create a VS2010 C++ Project

1) Open Visual Studio and create a new Visual C++ project.  The type of project you want to create is the one listed in Visual Studio 2010 as File => New => Project… => Visual  C++ => General => Empty Project.  Call it whatever you like, e.g. just “Lua” if it won’t conflict with any other version of Lua you’re using, or perhaps “Lua52” if you want to keep track of the version.




2) Copy or decompress the Lua source files into the default place where Visual Studio puts C++ files.  In VC++ for VS2010 this is in the project folder under the solution folder.  (If you’re unsure, create a temporary .h file and look at where VS has put it.) 

3) Now go back into Visual Studio and add the files into the solution from the Solution Explorer window using the Add => Existing Item… option.  Add all files with a  .h or .hpp extension under “Header Files” and all the files with a .c extension under “Source Files.”



Compile Lua

1) If you try to compile the project at this point, you’ll get an error message similar to:

luac.obj : error LNK2005: _main already defined in lua.obj

This is because the Lua distribution includes main files for both the Lua REPL / file interpreter (lua.c) and the byte code compiler (luac.c). 

2) For present purposes, you want the interpreter “lua.c,” so remove the compiler “luac.c” from the project.  Now do a rebuild all.

Run Lua
1) If the rebuild all succeeds, you should be able to run the Lua REPL either inside Visual Studio, from Explorer, or from a command prompt.  The result should look something like this:


2) Try entering a few lines as a test:


3) You can also run Lua program files from the command line by following the name of the executable with the Lua program file name.
That’s all there is to it.  Now you can begin exploring Lua as a language and as an embeddable interpreter.   No doubt you’ll write a “hello world,” a Fibonacci generator, etc.  If you want to try adding commands to the language itself in C code, you can try creating a function with your name, etc.  And check out the resources available from links on the Lua site, including the “batteries included” versions, and tips for compiling Lua under Windows using other configurations (including links to a few complete projects).

Lua Documentation Etc.

Be sure to read the documentation included with the Lua distribution.  It includes valuable and up-to-date tips on compiling and running Lua.

A very good manual is included with the Lua distribution, but if you get serious about Lua, I recommend the book “Programming in Lua” by Roberto Ierusalimschy.  An earlier edition is available online, which will help you get started (it’s called “The Red PIL” for its red cover).  However, if you end up liking Lua enough to keep using it, I recommend buying the more recent edition (called “The Blue PIL” for its blue cover).  It’s a great resource for learning Lua, and buying a copy will help support Lua.

Now the Bad News

Lua’s greatest strength is the fact that it compiles in plain old C on almost any platform imaginable, including native Windows.  Unfortunately, this is bad news if your “plain old C” is actually managed C++ under .NET.  Lua does a number of things that are very valid in C, but which are a problem for managed environments.

For this reason, getting Lua interacting properly with .NET takes a bit more effort.

But the good news is that all is not lost!  Lua is such a useful tool that many in the Lua community have put in the effort to get Lua working with .NET.

There are a number of solutions out there, from making the modifications necessary to get Lua compiled and working in a managed code environment, to complete interoperability environments.  Not being an expert on this aspect of Lua, I can’t recommend any specific tool.  However, as the popularity of Lua increases, I expect that things will consolidate around a few of the best solutions.

-Neil



5 comments:

Anonymous said...

magic, very clear many thanks

NauticalMile said...

Excellent article.

I just want to mention something for those of anyone interested in step 3) (for Windows). This process was not immediately obvious to me so I thought I would document it here.

To be able to run a Lua script within any directory, you need to set the PATH Environment Variable to a location where the executable can be found. It would be wise to put it in a new folder (e.g. \Lua\) inside %CommonProgramFiles% or somewhere like that. Then set the PATH variable to that location. I would recommend (re)naming the executable 'lua' for simplicity.

Now here's the part where I got hung up: if you were already running the command prompt when you changed/updated the PATH environment variable you need to restart the command prompt in order to make use of the new PATH.

Then you can run the stand-alone interpreter by simply typing

lua

or you can run a Lua script by typing

lua scriptname.lua

Finally any of the command line options are also functional. For example you can type

lua -i -llib1 -e "x = 10"

to load a library located in the current directory called lib1.lua, execute the statement x=10, and finally jump into interactive mode.

Hope this helps.

TechNeilogy said...

Thanks for the info! (BTW, I apologize, NauticalMile, for not moderating this in immediately. It was not deliberate, I just missed the comment email from Blogger; sorry)

Anonymous said...

No worries, TechNeilogy. I figured that was the case.

Unknown said...

how to run .lua files in visual studio?