The usual way would be to make a library, either static or dynamic at your choice. The advantage of a dynamic library is that if you change or improve the functionality of any of the functions, all your programs you previously linked to it will automatically use the new version. The principle disadvantage is that if you change the interface, you'll either have to (1) go back and change and recompile all your old programs that use the interface which changed, or they'll stop working, or (2) you'll have to go to the trouble of making different versions of your library to avoid that problem.
You also have a choice as to how many libraries you make. Certainly you wouldn't want to put each function in its own library. Conventional wisdom says that libraries ought to be coherent, and all the functionality in one ought to be related in some way, but you don't have to look any further than the C standard library to find one that's got all kinds of random stuff in it. If this is for your own purposes only, you may as well just dump it all into one, or have one library for all the graphics functionality, another one for the math functionality, and so on.
Even if you only have one big library, you can have different headers for related functionality, in exactly the same way as the C standard library works, so you don't have to pollute your program's namespaces with every single identifier that ends up being declared in the interface to your library.