2013-01-21 4 views
2

J'ai un projet avec 2 sous-projet (Sub1 et Sub2): projetcréateur QT doens't reliant

ESI 
| 
|__Sub1 
| 
|__Sub2 

Dans un fichier de mise en œuvre (Cpp) d'une classe dans le Sub2 (de demo1.cpp) i Avoir les besoins d'inclure une classe du projet Sub1. Donc, dans le demo1.cpp j'ai déclaré:

#include "../sub1/controller.h" 

Pourquoi l'éditeur de liens ne trouve pas le constructeur du contrôleur? (Dit référence non définie)

Merci de

Répondre

2

Votre #include indique au compilateur où il peut trouver la définition de votre controller classe (à savoir le contenu de votre fichier controller.h).

Afin de lier vers l'implémentation de votre classe controller, l'éditeur de liens requiert une bibliothèque qui contient l'implémentation déjà compilée. - Le projet Sub2 ne compile pas le contenu de Sub1 à nouveau, sauf si vous incluez les fichiers .cpp de Sub1 dans votre projet Sub2 ce qui serait une mauvaise pratique et pourrait entraîner d'autres problèmes, cependant.


En supposant Sub1 est une bibliothèque qui sera générée comme sub1.lib:

Vous devez ajouter les lignes suivantes à votre fichier .pro de votre projet Sub2:

LIBS += -L../Sub1 \ 
     -lsub1 

Ceci indique l'éditeur de liens qu'il existe un répertoire "../Sub1" qui contient des bibliothèques et qu'il existe une bibliothèque appelée "sub1.lib". L'avantage d'utiliser la syntaxe -L et -l est que cela fonctionne sur toutes les plateformes (Windows, Linux, Mac, etc.).


Si les deux Sub1 et Sub2 sont executables (à savoir les projets produire un .exe) fichier, vous devez extraire le contenu commun dans un projet distinct Sub3 qui a TEMPLATE = lib au lieu de TEMPLATE = app dans son fichier .pro.