I've been using Linux for a few months and have experience creating Windows applications with C++ and C# in Visual Studio. I'd like to learn how to build applications intended for Linux, including distributing them as AppImages, Flatpaks, and Debian packages. Is there a major difference in the development process compared with Windows, and what should I learn first? I'd also like applications to remain usable for a long time without constant updates. Would Docker or something similar help with compatibility, or is that solving a different problem? Eventually, I'd like to try developing native applications for FreeBSD as well.
4 Answers
You do not need a special engine just because the target system is Linux. Game engines and application frameworks have different levels of support for each platform, so check the engine’s Linux export and runtime support. The same general principle applies to desktop software: choose tools that officially support Linux, build on Linux, and test on the distributions you intend to support. Deployment and long-term maintenance are separate concerns from writing the application itself.
The main difference is that compiled binaries are generally built for a particular operating system and architecture. A Linux program will not normally run on Windows, and the reverse is also true. For Linux, you’ll also need to think about different distributions and their library versions. AppImages bundle most of what the application needs, Flatpaks use a runtime and sandboxing system, and .deb files are mainly intended for Debian-based distributions. Docker is primarily for isolated services and deployment environments; it usually isn’t necessary for building an ordinary desktop application.
Linux does not have one single desktop environment or distribution. An application using standard C or C++ libraries can often be portable, but its graphical interface may depend on Qt, GTK, or another toolkit. If you want broad compatibility, use stable public APIs and avoid depending on distribution-specific internals. Qt, GTK, and cross-platform frameworks can also make it easier to support other systems, including BSD, although platform-specific testing is still important.
Start with normal Linux development instead of focusing on packaging immediately. Learn the language and build system first, then choose a GUI toolkit such as Qt or GTK if you need a desktop interface. Keep the core functionality separate from the user interface so it can be reused or adapted later. After that, learn each packaging format and its build tools. No packaging method can guarantee that an application will work forever, because kernels, libraries, dependencies, and hardware support change over time.

That helps. I’m mainly interested in distributing the same application through AppImage, Flatpak, and .deb rather than relying on one format.