JUCE (Jules' Utility Class Extensions) is an all-encompassing C++ class library for developing cross-platform software.
It contains pretty much everything you're likely to need to create most applications, and is particularly well-suited for building highly-customised GUIs, and for handling graphics and sound.
JUCE is released under the GNU Public Licence, which means it can be freely copied and distributed, and costs nothing to use in open-source applications.
If you'd like to release a closed-source application that uses JUCE, commercial licences are available for a fee - click here for more information on pricing and terms.
JUCE can target the following platforms:
For all the platforms above, the code that you write is the same, and you don't need to worry about any platform-specific details. If your C++ is portable, then you should be able to simply re-compile your app to run it on other OSes.
Adding JUCE to your app is very simple - the easiest way involves simply including juce.h in your files and adding a single
cpp file to your project. No need to compile any libraries or worry about dependencies. Ideally I'd like to have made JUCE an include-only
library like the std c++ library.. that's not actually possible because of the platform-specific nastiness that it has to deal with, but to be
able to add a complete multi-platform library to your app in only two steps is a pretty good result!
Of course JUCE can also be built as a static library and linked into your application in the traditional way. Or you can use it in its 'amalgamated' form, where the entire library (all 350,000 lines of it!) has been cunningly compressed into just two (large!) source files. Having only two files to deal with means that you can easily add a local copy of them to a project and check them into your source control system, avoiding any external dependencies.
To further simplify the process of building across multiple platforms, the Introjucer will automatically generate all the compiler-specific project files you need to get the same app running in Xcode, Visual Studio, etc. Just use the Introjucer's IDE to build your project, and it'll take care of the hassle involved in keeping several different IDE projects in sync with each other.
In designing JUCE, I've tried to make it:
juce.h, you only include pure C++ classes, it won't pull in any platform-dependent headers.
Wherever it's possible to use a pure C++ technique instead of native functionality, I've done so.