2009-07-16 4 views
0

Je dois interdire dll ici que je voudrais construire sans avoir à les construire deux fois (force de construire les deux et les reconstruire à nouveau pour permettre la liaison).Construire deux dll interdépendants

Voici un exemple:

**DLL A** 

void fooA() 
{ 
    fooBB(); 
} 
void fooAA() 
{ 
    fooB(); 
} 

**DLL B** 

void fooB() 
{ 
    fooA(); 
} 

void fooBB() 
{ 
} 

Est-il possible de construire ces deux DLL sans maire refactoring?

Répondre

0

Reconstruisez-vous réellement les deux DLL chaque fois que vous compilez?

Dans le cas contraire, les bibliothèques d'importation devraient être créées pour la première fois - même si la phase de liaison échoue en raison de externals non résolues - et permettre à la suite Builds lien sans erreur ...

edit: nous avons fait ce genre des dépendances dans mon magasin. Notre build est en effet incrémental, et les builds propres ont besoin de quelques projets à construire plusieurs fois afin de les relier avec succès.

+0

C'est ce que je veux avoir en ce moment, je voudrais un moyen de construire seulement une fois en pleine construction. – Drahakar

+0

Eh bien, si la construction incrémentale n'est * vraiment * pas une option, je ne connais pas d'autre moyen que celui suggéré par jia3ep. Je suppose que vous pourriez également changer l'une des DLL à une bibliothèque statique. –

+0

Le mot clé external ne serait-il pas anyuse? Je sais que ça marche entre deux .obj, mais ça marche entre deux projets? Ou une compilation manuelle (/ c sur VS) avec un manuel/LINK serait-elle une option? sinon pourquoi? – Drahakar

1

Vous pouvez utiliser LoadLibary et GetProcAddr pour trouver les adresses des fonctions, puis appeler foo-functions par ses adresses.

Le code suivant demonstates comment le faire (vous devez ajouter le contrôle d'erreur réels DLL):

**DLL A** 

typedef void fooB(void); 
typedef void fooBB(void); 
fooB* fooB_ptr; 
fooBB* fooBB_ptr; 
HMODULE hDllB; 

void init() 
{ 
    hDllB = LoadLibrary(L"DllB.dll"); 
    fooB_ptr = reinterpret_cast<fooB*>(GetProcAddr(hDllB, L"fooB")); 
    fooBB_ptr = reinterpret_cast<fooBB*>(GetProcAddr(hDllB, L"fooBB")); 
} 

void done() 
{ 
    FreeLibrary(hDllB); 
} 

void fooA() 
{ 
    fooBB_ptr(); 
} 
void fooAA() 
{ 
    fooB_ptr(); 
} 

Même dans DLL B.

Questions connexes