My personal design decission is that if I make a C++ library I will only ever expose standard library types (or built in types) on my API's which I can guarantee to be abi compatible. If I cannot do that I expose an abstraction (e.g. an abstract baseclass + factory). This is good separation anyway and allows you to refactor internally if needed (e.g. switch internal libraries). Can you explain why you even think you need to expose the format library from your package?