How to compile Libtcod and C++, mirrored from Ysgard.net

Source: http://www.ysgard.net/2011/06/visual-studio-2010-c-express-and-libtcod/

So I was playing with the Doryen Library, aka libtcod, the other day.  What a fantastic little library.  I had just finished a small demo for displaying how influence maps works (more for my own education, as I’m a pretty inexperienced programmer and doing is how I learn) and was pretty pleased with the result.   I’m using Visual Studio Express because I use Windows and happen to like it a bit more than Code::Blocks.

Okay, so I don’t need that debug window anymore.  Go into the linker properties, specify the subsystem as Windows app, compile…. and BAM!

MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
C:\Sigil\VS\InfluenceMap\Debug\InfluenceMap.exe : fatal error LNK1120: 1 unresolved externals

Hmm, okay what’s going on here?  Check the libtcod documentation… no, there’s nothing here about this.  Why is this happening?

The answer to this lies in the way the program is run.  Before, I was compiling the program as a console app.  For this, the standard C++ entry point, main, was sufficient.

int main(int argc, char** argv)

But the moment I specified the program as a Windows application, the rules changed.  To use the Windows api, I need a Windows entry point, which is defined like this:

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

But the samples I’ve seen don’t define this entry point.  They define a standard main().  So what am I missing?  As it turns out, I’m missing SDL!

libtcod is an SDL library, and SDL has its own way of mapping main() to WinMain().  But in order to make this happen, you also need to link in SDL and pull in the SDL.h header.

Here’s how to set up a Visual Studio project with both libtcod and SDL.  You can then write and test your application using the console window, and when the time is right, switch to a native windows app without any issues!

Here’s the exact procedure I followed.

  1. Download and extract the libtcod library for Visual Studio to wherever you place your libraries.  In my case, I extracted it to C:\Sigil\VS\libs, which resulted in the folder C:\Sigil\VS\libs\libtcod-1.5.1.
  2. Download and extract the SDL development libraries for Visual Studio.  You want the latest one available, I used SDL-devel-1.2.14-VC8.zip.  I extracted it to C:\Sigil\VS\libs\SDL-1.2.14.
  3. Open Visual Studio Express.  Create an Empty project for your new libtcod application.
  4. Right click on your project in the Solution Explorer and select Properties.
  5. Go to Configuration Properties -> VC++ Directories.
  6. Click on Include Directories, and from the little drop-down box on the right, select <Edit…>
  7. Click on the little folder icon to add a new folder to your include directories, specify the directory for your libtcod library (for me, C:\Sigil\VS\libs\libtcod-1.5.1\include).
  8. Do the same for SDL (mine was C:\Sigil\VS\libs\SDL-1.2.14\include).
  9. Click OK.
  10. Now do the same for the Library Directories, specifying the folders for your libtcod and SDL lib directories.
  11. Now go to Configuration Properties -> Linker -> Input.  Click on Additional Dependencies, click on the drop-down box, select <Edit…>.  Add the following dependencies, one per line: libtcod-VS.lib, SDL.lib, SDLmain.lib.  Click on OK.
  12. There’s one final step left.  You need to pull in the main SDL header file.  At the top of your main file, add #include <SDL.h>

You’re now set!  Go ahead and develop your application as normal.  Whenever you’re ready (or just want to test it) you can set your linker to produce a native Windows application.  To do this, you need to go into the Properties windows again, and select Configuration Properties -> Linker -> System.  In the right-hand pane, click on SubSystem and select Windows (/SUBSYSTEM:WINDOWS) from the drop-down menu.

Build your application again, and you should now be enjoying some console-free Windows goodness!

Imgur API part 3: OAuth2

It’s been a while since I wrote the last one, but a user on reddit asked how to get OAuth working with Imgur, and I couldn’t resist giving it one more shot. Thanks to my recent experience with the Netflix API, even though it was in C# rather than in Python, I was able to wrangle a quick and easy script for getting started.

Here’s the PasteBin with the complete code, thought it’s shown at the bottom of the page, as usual. Continue reading

Netflix Catalog January update

Took a few  weeks off, first for school, and then for christmas. Back only a few days, and I’ve learned the basics about Cookies and Filters in ASP.NET MVC. They’re both pretty simple, even moreso than I thought. Instead of rewriting a lot of the stuff I read, I’ll just link to the StackOverflow answers that I used directly.

For the cookies, it’s here, where it shows both how to add and delete (via setting the Expiry of the cookie to yesterday) a cookie. I thought that was pretty neat. Basically all it is is a number that the browser stores, and then the server has to do something with that.

Which brings me to Filters, with a SO answer in two parts: Here and the offical docs, which are very surprisingly handy this time. Filters just run before and after certain events, like Authorization, Actions, Results and Exceptions. I’ve only played with “OnResultExecuting” which mean before the ViewResult has been finished being processed, since if I change the ViewBag in the filter, the returned view with contain the modified data.

Other than that, I’ve run into a strange issue which I’m really hoping to solve: the catalog index I got the from Netflix API is incomplete! It’s got about 56k titles on there, individual shows included as separate entries (something I still have to sort out) and I can’t find certain titles, like Dexter and The 4400, which are both available for streaming off Netflix.com. I’ve made a post asking for clarification here but looking at the post, it seems like I’ll need to cross post into the “Help me” subforum, rather than the “API forum” forum.

My buddy is still working on the Rotten Tomatoes thing, which has taken a few months now. He hasn’t made much progress as far entering things into the database, but then I realized that without the huge /catalog/titles/streaming resource, I’d probably be in the same spot he is. I’ll have to remind him about the OMDB tool, and how we can just pull the RottenTomatoes data from there instead. Then it’ll be a matter of associating the Netflix movie with the RottenTomatoes movie. That’ll be tricky.

Anyway wanted to make a post here because  it’s been a while, and it doesn’t get any easier to write these. And although I now manage to get about 1000 people to the site a month, I realized 75%+ of them are here for the tutorials I have written. I really should keep working on those… If you ever have something you’d like to learn about, please hit me up!

You should follow me on twitter @tankorsmash to hear me complain about the official docs, or how All That Remains is dead

Latest Project: A new website!

What’s up dudes! It’s been a while, but I’ve been busy. If you’ve been following me on Twitter, you’ll see that I’ve been working on this new website. It’s basically just like 5000best.com/movies or easyqueue or whatever it’s called. I’ve never used them, since I only use it on the xbox, and the interface is pretty bad!

But anyways, the project has been underway for a few weeks now, and while it’s my first website that I’m building from as scratch as you can get with C#’s ASP.NET MVC4, it’s coming along nicely. So far, I’ve managed to pull down the Netflix API’s Index, so that’s about 55k titles that I’ve got to play around with. The dataset is pretty complete, which means that it’s pretty comprehensive.

Once I got MVC4 set up and working, which was not easy, even with sec_goat’s help by the way, was getting a database local server working. I don’t want to get into that too much, because I’m still sick of the idea, but basically MVC4 uses 2012 SQL databases, and I had SQL SERVER 2008, so I needed to update to 2012 to match the server I had created. That meant I needed to update to ’08, ’08 SP1, ’08 R2, ’08 R2 SP1, ’08 R2 SP3, then finally ’12. I think I even needed SP1 on the ’12. But it really isn’t clear the order to me, since at that point I was just installing everything I could and trying to get it to work. It was frustrating.

Another issue I am currently dealing with is the idea of Database Normalization. What that is is essentially splitting up a database in order to get to be the least redundant as it could possibly be. Reducing columns that work out to the same thing. Like say you had an ingredient list, and you added ketchup and mustard and pickles. But EVERY single time you didn’t use ketchup, you took away mustard too, so that means that you might as well have one column called toppings yes or no, rather than a ketchup and a mustard column. Well, that’s actually a really poor example. As usual, Stack Overflow has a better example, as well as About.com actually.

So back to the issue. I used to have ALL the relevant data from the Netflix API in one massive, ugly table, but I wasn’t happy with how long that it was taking to get data from it (and apparently DB Normalization doesn’t really help with that, but maybe it does, I really don’t know at this point) so I endeavored to break it up. So it’s most of the movie data, like year released, duration, rating etc in one table, then a list of all the genres into another, then a cross table, linking one genre to one movie ID. And with Box Art, I’ve got a table of movie id’s linked with the box art of relevant sizes. That way whenever I need to box art for a movie ID, I can just select it from the BoxArt table, rather than look through the whole movies database. Dunno if it helps my speed case at all, but I hope so.

Right this minute, I’m building the list of Movie to Genre table to make. It’s been about 20 minutes since I’ve started writing this, and it’s at movie 909 out of 55k. It’ll take about 10 hours I think to create the table in full, but I’m told that isn’t a terrible amount of time. But again, I don’t know for sure.

So there you have it, good news and bad new. A lot of frustration but a lot of new information, so you take what you can get. I definitely don’t like knowing absolutely nothing about DBM and SQL, and asking really basic questions, but I guess that’s just part of the job. Er, hobby.