I was looking at versioning a shared library for a small personal project when the docs for the
SOVERSION target property mentioned that on Mach-O systems such as OS X and iOS, it corresponds to the “compatibility version”, while
VERSION corresponds to the “current version”.
On Linux, it’s simply something like
VERSION 5.4.2 and
SOVERSION 5 to indicate that the library is compatible with version 5.0 and newer, and
VERSION is used as the DLL image version in the form
<major>.<minor> on Windows (I’m not sure what difference
SOVERSION makes on Windows).
However, the example in the docs for the referenced
FRAMEWORK target property illustrate how you might have
VERSION 16.4.0 and
SOVERSION 1.0.0 on Mach-O platforms (I’m not interested in building a framework, just wondering about the foreign versioning scheme.)
Just how does versioning work in the Mach-O world? I’m used to just bumping the major version if I remove some functionality, which would be a compatibility break, so how is it possible that a library at version 16.4.0 remains compatible with the 1.0.0 version of the library? What does “compatible” mean?