La liaison entre le .dll et ton application passe par un .a (ou un .o si ta dll ne fait qu'un seul fichier (peu probable)).
Dans le cas d'une lib statique, le .a contient le code intégral de toutes les fonctions. Dans le cas d'une dll, le .a contient le morceau de code qui ira chercher la référence dans le fichier .dll: ça revient à charger la dll s'il elle n'est pas déjà et récupérer l'adresse de la fonction.
Le truc c'est que le .a contient le nom de la dll à charger. Donc tu ne peux pas utiliser un même .a pour des dll avec des noms différents, ce qui est certainement le cas avec un système de plugin. Là tu es obligé de chargé ça à la main.
Avec C::B, il te génère tout ça comme un grand, pour peu que tu lui indiques ça dans Project => Properties => Build targets