My resolution-independent GUI uses a dynamic texture atlas of glyphs which is automatically populated with the most recently used characters as they are needed. I use Freetype to generate the glyph textures and they are placed in atlas textures corresponding to the desired font size, generally with a separate atlas for 8pt, 16pt, 32pt, etc fonts.
At runtime, the renderer picks the smallest previously cached glyph to use (or adds a new glyph to the atlas) that is not more than double the requested font size. You need a hash map cache from character ID to glyph entries, each of which contains a list of pointers to the atlas textures for the different sizes for the glyph. The renderer then builds a vertex buffer of quads/texture coordinates which it renders.
This way, you can build your GUI at some standard resolution, and then apply a scale factor to all sizes/positions when operating at different resolutions that produces a pixel-perfect result.