I have an app that links to two dynamic frameworks which both link to the same static library, as follows:
|--App
|--DynamicFramework1
|--StaticLibrary
|--DynamicFramework2
|--StaticLibrary <- the same library that DynamicFramework1 links to
The static library's symbols are included in each framework's binary because of the way dynamic frameworks are built by default. The app therefore finds duplicates of the static library's symbols at runtime.
Is it possible to link a dynamic framework to a static library (and to reference the classes and methods of the static library within the dynamic framework) in a manner that symbols from the static library are excluded from the dynamic framework's binary?
My hope in doing this is that the binary of each of the two dynamic frameworks will exclude the symbols of the static library. I will then make it the responsibility of the app to link to the static library directly.
Let's say you have two dynamic frameworks named DF1
and DF2
which both link to the same static library named SL
.
I couldn't find a way to build DF1
and DF2
in a manner that they link to SL
whilst excluding the symbols of SL
from their binaries.
The best solution that I've been able to come up with thus far is as follows:
DF
– that uses the -all_load
linker flag and links to SL
.1DF1
and DF2
to link to DF
instead of SL
.2DF
as well DF1
and DF2
.3In pictorial form, this is:
App
|--> DF1 --> DF --> SL
|--> DF2 --> DF --> SL
|--> DF --> SL
See here for a minimal Xcode project that demonstrates this workaround.
The Benefits of mergeable libraries section of the Meet mergeable libraries talk from WWDC 2023 offered promise. In that talk, the speaker said:
... When merging, the linker can de-duplicate content, such as strings, across all libraries. For instance, it removes redundant symbol references, Objective-C selectors and obj_msgsend stubs...
I experimented with it but, sadly, I was not able to get it to solve the problem at hand. This question perfectly summarises my experience.
SL
will be in DF
's binary.DF
will not be in DF1
and DF2
's binaries.SL
from DF
only.