I am a Fedora Fanboy. I love the distro. I will always recommend it to everyone. Despite that love, it seems like we have to cater our minds to how Fedora wants to do things. And believe me, it does things very differently when compared against Debian or any of its common derivatives. One major point of contention early on was getting used to how differently Apache works on Fedora opposed to Ubuntu. I actually prefer using Apache deployed on Ubuntu than I do Fedora. I fucking hate administering Apache on Fedora systems.
That being said, I wanted to take a few moments to discuss my adventure with SFML (Simple and Fast Multimedia Library) on Fedora from getting it installed, setting it up and actually compiling a simple source file with it.
First of all, I’m diving into SFML because there’s a project that I’ve been piecing together for a while and I think SFML fits the bill nicely based solely on research and reading the API. It also allows me to take a break from Java development and step back into C++ which is my favourite language. I feel all warm and fuzzy writing in it. I’ve always had 100% success getting SFML setup and configured on Windows computers with Visual Studio 2012. The obvious problems there are (A) I have to use a Windows computer (it’s bad enough that I’m surrounded by them at work and my laptop has Windows 7) and (B) while Visual Studio may be really pretty, I’ve never jived with how you have to use the GUI to configure all of the esoteric settings for the compiler and linker; it just feels clunky. I’d much rather type it out on the terminal or use a makefile.
Furthermore, as a bit of a primer, SFML is a multipurpose library for creating programs that need audio, graphics, networking or GUI resources in a cross-platform way using C++. The obvious use is video games but it can be applied to other types of programs as well.
Typically, when installing software libraries on Linux, you just hope and pray (if that’s your thing) that somewhere in your repositories that a pre-configured package exists for them. We shudder at the alternative method which is manually compiling and installing. I do anyway. So I was overwhelmingly pleased to see that the default repositories on Fedora did in fact have packages for SFML (SFML and SFML-devel). Cool!
For shits and giggles, I copied the source code that’s given on the SFML tutorial site and attempted to compile it (not link). I get my first ding.
#include <SFML/Graphics.hpp> not found
Fuck. Right off the bat, g++ can’t find a critical header that’s needed for the source to compile. So I did some digging. Knowing that library headers are typically under /usr/include, that’s where I started at. What a surprise! The headers got installed in a directory tree that went like this:
Well that’s not going to work at all. So I moved the SFML directory out to /usr/include and removed the SFML-2.0 directory. Compilation success!
What About Linking?
This is usually the step where things get hairy when they go wrong. After getting a successful compile with an object file, I tried to link based on the steps in the tutorial.
g++ <file>.o -o <file> -lsfml-system -lsfml-window -lsfml-graphics
Result? ld can’t find any of the sfml-* libraries! Fan-fucking-tastic!
So there were a few things going on here that could have been causing the particular problem. First of all, I’m using a 64-bit version of Fedora. All libraries that are automatically installed by Yum, unless specified otherwise, will install the 64-bit version of the library. These files go under /usr/lib64. Some people have said that they’ll find them under /usr/local/lib64 but on my Fedora system they were under the former. It’s best to find out before you go rooting around and changing shit.
Second of all, ld wasn’t looking in /usr/lib64 for libraries. You can find out where ld is looking for libraries by looking at the /etc/ld.so.conf file. Although not entirely proper, I simply tacked the path to the end of the file and wrote it out. Once you do that, you need to run ldconfig (as root) to enforce the changes. If this step weren’t done, you’d have to keep linking with -L<path-to-library>/lib every time.
Lastly, even after all of that, my linking attempts were still failing. The reason this time? Name mismatches! That’s right the damn names of the libraries were wrong. The tutorial tells you to link to -lsfml-window. By default, I should have linked to -lsfml-window-2.0. Fucking bullshit. That went for any of the SFML shared object files. So I renamed those symlinks and took out the “-2.0” at the end so that -lsfml-window would work.
After all that, I finally got a successful build of a demo SFML program and got the green circle in a 200×200 window. Why I had to go through all that trouble to get the trivial tutorial program to compile is beyond me but now that it’s working, I can move forward with my deeply laid plans to make shit happen.