2010-03-24 5 views
4

J'utilise Google cadre de test pour définir des tests unitaires. J'ai trois projets dans ma solution:C++ liant question sur Visual Studio 2008, lorsque réticulation différents projets sur la même solution

  • FN (mon projet)
  • FN_test (mes tests)
  • gtest (Cadre Google test)

Je mis FN_test d'avoir FN et gtest comme références (dépendances), et puis je pense que je suis prêt à mettre en place mes tests (j'ai déjà mis tout le monde à/MTd (ne pas le faire me conduisait à des erreurs de liaison avant)).

En particulier, je définis une classe appelée Embark dans FN que je voudrais tester en utilisant FN_test. Jusqu'ici tout va bien. Ainsi j'écris une classe appelée EmbarkTest en utilisant googletest, déclarer un membre Embarquez * et écrire dans le constructeur:

EmbarkTest() { 
    e = new Embark(900,2010); 
} 

Puis, F7 pressé, je reçois le texte suivant:

1>FN_test.obj : error LNK2019: unresolved external symbol "public: __thiscall Embark::Embark(int,int)" ([email protected]@[email protected]@Z) referenced in function "protected: __thiscall EmbarkTest::EmbarkTest(void)" ([email protected]@[email protected]) 1>D:\Users\lg\Product\code\FN\Debug\FN_test.exe : fatal error LNK1120: 1 unresolved externals

Est-ce Quelqu'un sait ce que j'ai mal fait et/ou que puis-je faire pour régler cela?

EDIT: pertinent Code de Embark.h

class Embark 
{ 
public: 

    //Constructor for initial state 
    Embark(int _id, int _year); 
    //Destructor 
    ~Embark(); 
/* ... */ 
} 
+0

Qu'en est-il du code correspondant d'Embark.cpp? –

+0

J'ai eu un problème très similaire avec Visual Studio 2013 en essayant de lier le cadre de test unitaire C++ interne de Microsoft. Après avoir essayé cette question/réponse m'a aidé. En outre, en indiquant l'évidence, les tests unitaires ne fonctionnent pas comme dans les langages dynamiques. Si vous appelez une fonction indéfinie en Python, le test de l'unité échoue. Si vous appelez une fonction indéfinie en C++, le projet ne liera pas et aucun test ne sera exécuté. Besoin d'adopter une approche légèrement différente de TDD en C++. –

Répondre

3

J'ai trouvé la réponse plutôt simple. Après deux jours d'intense headknocking, il est ceci:

Vous devez compiler votre projet principal comme .lib et non .exe

Après avoir fait cela, tout comme la liaison est allé bonheur. Je pensais que Visual Studio le ferait automatiquement pour moi, puisque j'ai déclaré une dépendance à FN de FN_test: j'ai supposé que Visual Studio créerait les libs. Ce n'est pas le cas.


RANT (pas besoin de lire après)
Comme il est plutôt rare de lier un projet qui fait un exécutable à un autre qui fait la même chose, trouver des références sur ce genre de question était un peu difficile. Les recherches Google ne m'ont pas donné de résultats utiles. Les forums MSDN étaient également inutiles.Mais lorsque vous effectuez des tests unitaires sur une application, est-ce que cela se produira, disons, un projet de test et un projet d'application sur la même solution? Je n'ai aucune connaissance sur d'autres frameworks de test pour C++. J'ai choisi Cadre Google Test:

  1. Dans Google nous confiance
  2. documentation Grande
  3. Très simple à utiliser et à comprendre

Mais, cependant, il n'a pas mérite beaucoup sur l'intégration. Je pense que d'autres outils s'intégreraient bien mieux à Visual Studio, à la réactivité IDE incluse. Mais j'ai préféré souffrir maintenant qu'après. J'espère que cet outil continuera à s'améliorer, car je l'ai aimé.

+1

Je fais cela sans le projet de test séparé Les projets de bibliothèque contiennent leur propre code de test qui est exclu de toutes les configurations sauf la test 1, et la configuration du test construit un .exe au lieu d'un .lib –

+0

C'est une bonne approche, mais j'ai deux exes, pas une librairie et un exe ... Mais l'idée de créer une configuration appelée, disons, Test, c'est bien Changez pour tester et exécuter, il va exécuter le test, pas l'application. –

1

L'éditeur de liens ne peut pas trouver la définition du constructeur Embark.

  • Avez-vous défini ce constructeur quelque part?
  • Votre projet de test est-il réellement lié à la bibliothèque FN?
+0

1) Oui, il est défini à la classe Embark (FN). 2) Je m'attends à ce qu'il soit lié à la bibliothèque FN, puisque je l'ai configuré comme référence (dépendance) à FN_test (j'ai fait de même pour gtest, et je n'ai pas de problèmes de liaison là-bas). –

+0

Pourriez-vous publier le code pertinent à partir de l'en-tête et du fichier source contenant la classe Embark? –

+0

Les dépendances ne sont pas toujours liées - avez-vous activé les propriétés de configuration -> Linker -> Link Library Dependencies? –

1

L'éditeur de liens ne peut pas trouver Embark::Embark(int, int)

Voici ce que MSDN dit à propos de l'erreur LNK2019.

+0

Je voudrais savoir pourquoi l'éditeur de liens ne peut pas le trouver –

+0

Il est très probable que vos paramètres de projet.Pouvez-vous nous montrer ce que vous faites à ajouter les dépendances à votre projet – xian

+0

Projet -> Project Dependecies -> FN_test -> vérifier FN et gtest, OK –

Questions connexes