Depends on the approach you want to take.
If you want to end up with a compiled binary, that will run on as many distros as possible, then yes; as
@CaffeineAddict says, the 'standard' approach is to completely write the entire thing in a recognised programming language. You need to learn what the various dependencies/libraries offer, and how to access their functions. You need to learn how to debug/troubleshoot, throughout the entire process. If you want to have a GUI - and most people will want this - you have to learn how to create this, too.
You'll need to learn how to package.....and every 'family' of distros has its own set of official 'rules' as to how this is done.
~~~~~~~~~~~~~~~~~~~~
Probably a far easier approach is to use something like a Bash script, calling-in and using a bunch of standard components that come with the OS OOTB. Myself, I've written a number of small utilities in Bash - in self-contained, 'portable' format - that work this way, with a simple GUI created with YAD (Yet Another Dialog).
One of my acquaintances on the Puppy Linux forum has been building his own PDF viewer over the last couple of months, using the same approach; making use of existing standard components/commands, and fronting the whole thing with a YAD GUI.
This is much the easiest way for beginners to achieve something 'workable' that also looks halfway respectable.
Mike.