I'm packaging an application for the first time for Ubuntu. I have a few dependencies, the primary ones being Qt and ICU. I'm just not clear how to deploy these applications without getting into a kind of dll-hell for Linux.
For example, I would like to use version 4.7.4 of Qt because there are some bug fixes in that release that I would like to take advantage of. I would also like to deploy my application on all the currently supported versions of Ubuntu, which takes me back to Lucid. But the latest version available for Lucid is 4.6.2, which isn't even API-compatible with 4.7.4. The options, as I see it:
- Just say "tough" and only support Ubuntu versions that have the library I need, which would mean Oneiric at this point. For earlier versions, they are on their own to find a 4.7.4 library and resolve all its dependencies.
- Provide private versions of the library, say libQtCore4_mycompany, and a package to install them.
- Stick a private version of the assembly side-by-side with my application (perhaps
/opt/company/package/lib) and set
LD_LIBRARY_PATHbefore executing my application.
None of these are great options, and in particular,
debuild is awful to use if you depart in the slightest bit from their expectations. I cannot link statically because of LGPL restrictions (at least, that's how I understand them.)
I also have the reverse question. Suppose I decide to put a dependency on
libQtCore4 (>= 4.7.4). I have seen enough regressions between Qt versions that there is a chance that 4.7.5, or 4.8.0, will break something in my application. Is that just something you have to deal with, or is it a best practice to depend on an exact version of the library, like
libQtCore4 (= 4.7.4)?