Możesz kompilować każdy z tych projektów statycznie, włączając bibliotekę danego rodzaju bezpośrednio do programu. Plusem takiego rozwiązania jest łatwiejsza dystrybucja binarnej wersji programu. Minusem jest wzrastająca objętość pliku wykonywalnego (np. dla kompilatora gcc, to kompilacja z flagą -static)
Jeśli jednak nie chcesz rezygnować z konsolidacji dynamicznej, to tu już możesz mieć wiele dróg.
- podanie podczas kompilacji konkretnej wersji biblioteki
- użycie mechanizmu soname i pozostawienie rozwiązania wersji linkerowi
- użycie innej konfiguracji środowiska uruchomienia dla danego programu (dla GNU/Linux to ustawienie zmiennej LD_LIBRARY_PATH)
- wymuszenie ładowania biblioteki przed/na samym początku ładowania programu (znów dla GNU/Linux to LD_PRELOAD)
- ładowanie biblioteki przez sam program (rodzina wywołań dlsym(), dlopen()... )
Jeszcze kilka opcji istnieje... Jak choćby przełączenie się na inny katalog bazowy, startującego programu, używanie mechanizmów snap czy flatpack, konteneryzacja...
A najprościej (nie znaczy że najwygodniej)? Połóż biblioteki w katalogu programu i ustaw zmienną rozwiązującą katalog z bibliotekami na katalog programu.