You are probably using customized in a wrong way. The desktop application (coded in C++, and distributed as a packaged binary executable) has not been customized, but user configured.
Customizing a desktop application means that some developer (internal to -or subcontractor of- the company where that application is used) has gotten, studied, and improved the desktop application's source code. This is uncommon and very costly.
You should ensure that the user configuration (e.g. preferences) are compatible from one version to the next (perhaps by having a functionality to transform that configuration).
Some (rare) applications indeed can be "customized" thru plugins (on Linux the application would dlopen(3) some shared object at runtime, during startup). If your application can have plugins, the plugins need to be written by a professional programmer (not by the random user), and you should have carefully designed and documented a good plugin interface. If you change that interface old plugins won't work with newer versions of your software.
Other applications embed a scripting language interpreter (like e.g. Lua or Guile). This is a very strong design decision and you should decide that before even starting coding your application.
Upgrading a software while it is still running is a research subject (and is never done for desktop applications). Read about persistence, continuation, calll stack, software package...
Notably on Linux, study the source code of some free software applications. It will teach you a lot.