Воздержитесь от использования типов из B-заголовков в интерфейсе вашей библиотеки. Хороший способ полностью скрыть реализацию - использовать factory-pattern вместе с чисто абстрактными базовыми классами в качестве интерфейсов. Вам все равно придется связать B.lib в вашем приложении.
Образец до:
// A.h
#include "B.h"
class Foo {
public:
void DoStuff();
private:
B::Bar Data; // B::Data comes from library B
};
Это в вашем заголовке добавляет зависимость к B.
В Factory ваше приложение теперь использует IFoo.h вместо A.h:
// IFoo.h
class IFoo {
public:
static IFoo * CreateInstance( ); // implemented in IFoo.cpp, just returns new Foo
virtual void DoStuff() = 0;
virtual ~IFoo() {}
};
// A.h
class Foo : public IFoo {
public:
virtual void DoStuff();
private:
B::Bar Data; // B::Data comes from library B
};