Создаем первую свою DLL , которая будет использовать функционал из другой dll, которая в свою очередь использует функционал другой dll и т.д.
Как устроены dll файлы. В них есть раздел экспорт функций и импорт функций. Информацию по содержимому можно посмотреть с помощью соответствующих программ, но сделать это придется, чтобы понять цепочки завичимостей одних dll от других.
Так вот экпорт раздел перечисляет функции реализуемые dll.
Раздел импорт содержит ссылки на функции других dll, от которых зависит данная dll.
Соответственно когда мы обращается к одной dll она подгружает все dll, от которых она зависима.
Например применительно к среде Qt, когда наше приложение стартует оно подгружает QtCore4d.dll и т.д. (это MDd ключ компиляции).
Теперь мы создаем свою dll и хотим ее функционал подгружать в приложение.
Тут надо задать специальный префикс (у нас MYDLL_EXPORT) и применить его для всех функций и классов, чтобы сделать их экспортируемыми (или импортируемыми).
#ifdef DEF_MYDLL
#define MYDLL_EXPORT Q_DECL_EXPORT
#else
#define MYDLL_EXPORT Q_DECL_IMPORT
#endif
Эту конструкцию обычно выносят в отдельный h файл. И тут важно для каждой своей библиотеки создавать уникальное название дефайна DEF_MYDLL и еще важно создавать разные уникальные наименования этих h файлов.
Далее важно в pro файле собираемой библиотеки добавить в DEFINES среды сборки DEF_MYDLL, он будет подставляться как ключ командной строки для компилятора cl.exe.
Таким образом: DEFINES += DEF_MYDLL . Кстати это только к shared сборки относится.
В результате получится так, что когда мы имеем DEFINES += DEF_MYDLL в проекте сборки, то мы прлучаем экспорт функций, классов и т.д. (у которых стоит префикс MYDLL_EXPORT).
А вот когда в нашем проекте нет DEFINES += DEF_MYDLL мы получаем указание импорта функций, классов и т.д. (у которых стоит префикс MYDLL_EXPORT). Да и тут мы ссылаемся на внешнюю библиотеку через директиву LIBS += ... pro файла.
Все это работает потому, что мы всегда кроме самих библиотек также подключаем и их заголовочные h файлы.
Можно добавить, что можно раз и навсегда вообще забыть от dll файлах и собирать свои проекты статически: Настраиваем статику и динамику.
Но динамика (dll) удобна тем, что пересобирается проект намного быстрее, это удобно именно при разработке и отладке.