The non-flippant answer is to just provide the source and let the distros package it for you. It's a different model. Linux users want to get their software through an integrated package manager, and volunteers will take your software and do all the work needed to make that happen.
This has nothing to do with the OS. A statically linked linux executable will likely run on any kernel from version 1 to version 4. The issue here is dynamic linking, and windows DLL hell has a name for a reason
Which libraries are you including in your description of a statically-linked binary on Linux ?
Finally, Windows DLL hell hasn't been a thing since the early 2000s, and even then, it was primarily only an issue with applications dumping shared libraries into the Windows system directories.
* systray icons/application indicators
* newer fontconfig versions support new config options which results in fonts being broken for apps that use older versions
* I think there is some issue around glibc locales handling if you use a different glibc
* systemd/logind/... DBus apis
Those were just some external interfaces that came to my mind. I'm sure there are many more.
- Your app isn't licensed in the way you like
- You don't want to provide the source code to your app
- They don't find your app interesting enough
- They don't agree with your app's policies
Static linking is a much better response for actually getting the program running on Linux systems but this still leaves out the "is there a way I can package it once for Linux" problem.
Now if it's a CLI only utility/service type tool it's a different story.
# dpkg-deb --build ./src/ mydeb.deb
Stick your dependencies etc in ./src/DEBIAN/controlOr just distribute a tar with your application.
I used to have to distribute a cross platform java progam. It was horrendous creating the MSI on windows. The linux and osx versions were trivial
Deployed by apt/yum/mdm andslme crappy windows thing. The latter was the problem.
It's not hard to make a static binary.
On the other hand most of the "software" I write - mainly shell scripts - includes things like apache configuration, requires other applications (like apache, iperf, tcpdump, lldp, etc)
I want to deploy these to multiple boxes, I want them versioned, I want them easy to update, I want to know what version is installed. All of this is handled by a 10 line config file in a .deb.
Long story short, it wasn't possible. Because the latest versions of Ubuntu and CentOS at the time used different versions of glibc which were mutually incompatible.
> Static linking of glibc is not supported on Red Hat Enterprise Linux.
https://developers.redhat.com/blog/2016/02/17/upgrading-the-...
:/tmp$ file ffmbc
ffmbc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
statically linked, for GNU/Linux 2.6.15, BuildID[sha1]=...., stripped
:/tmp$ ldd ffmbc
not a dynamic executable
It runs on the following libc versions: ldd (GNU libc) 2.12 (Centos 6.9)
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.14) 2.19 (ubuntu 14.04)
ldd (Ubuntu GLIBC 2.23-0ubuntu10) 2.23 (Ubuntu 16.04)
I'm fairly sure it ran on distributions as old as ubuntu 8.04And then sit and scratch your head over why software vendors don't sell a version for your OS.
If so, I wouldn't worry about packaging for every distro. Just make sure that your application isn't difficult to build, and most things (paths, etc.) are configurable. The config path can be handled with a command line switch.
Once you've gotten your application so that it can be built easily, I'd only really worry about packaging it for your distro of choice. If people are interested in your application, it'll get packaged for their distros.
If your application is proprietary, I wouldn't even worry about packaging it yet. Getting most Linux users on non-essential proprietary software will be an uphill battle.
I guess of you're working with gui that's a different story. But for .net websites and background servers, simply use docker on linux and never lool back. And it's much simpler than docker for windows too.