2009-08-09 8 views
4

Je suis un peu confus sur la mise en place de la bibliothèque de test de boost. Voici mon code:Boost :: Test - génération de Main()?

#include "stdafx.h" 
#define BOOST_TEST_DYN_LINK 
#define BOOST_TEST_MODULE pevUnitTest 
#include <boost/test/unit_test.hpp> 

BOOST_AUTO_TEST_CASE(TesterTest) 
{ 
    BOOST_CHECK(true); 
} 

Mon compilateur génère le message d'erreur merveilleusement utile:

1>MSVCRTD.lib(wcrtexe.obj) : error LNK2019: unresolved external symbol _wmain referenced in function ___tmainCRTStartup 
1>C:\Users\Billy\Documents\Visual Studio 10\Projects\pevFind\Debug\pevUnitTest.exe : fatal error LNK1120: 1 unresolved externals 

Il semble que le boost :: bibliothèque test ne génère pas une fonction principale() - J'étais sous l'impression de faire cela chaque fois que BOOST_TEST_MODULE est défini. Mais ... l'erreur de l'éditeur de liens continue.

Des idées?

Billy3

EDIT: Voici mon code pour contourner le bogue décrit dans la réponse ci-dessous:

#include "stdafx.h" 
#define BOOST_TEST_MODULE pevUnitTests 
#ifndef _UNICODE 
#define BOOST_TEST_MAIN 
#endif 
#define BOOST_TEST_DYN_LINK 
#include <boost/test/unit_test.hpp> 

#ifdef _UNICODE 

int _tmain(int argc, wchar_t * argv[]) 
{ 
    char ** utf8Lines; 
    int returnValue; 

    //Allocate enough pointers to hold the # of command items (+1 for a null line on the end) 
    utf8Lines = new char* [argc + 1]; 

    //Put the null line on the end (Ansi stuff...) 
    utf8Lines[argc] = new char[1]; 
    utf8Lines[argc][0] = NULL; 

    //Convert commands into UTF8 for non wide character supporting boost library 
    for(unsigned int idx = 0; idx < argc; idx++) 
    { 
     int convertedLength; 
     convertedLength = WideCharToMultiByte(CP_UTF8, NULL, argv[idx], -1, NULL, NULL, NULL, NULL); 
     if (convertedLength == 0) 
      return GetLastError(); 
     utf8Lines[idx] = new char[convertedLength]; // WideCharToMultiByte handles null term issues 
     WideCharToMultiByte(CP_UTF8, NULL, argv[idx], -1, utf8Lines[idx], convertedLength, NULL, NULL); 
    } 

    //From boost::test's main() 
    returnValue = ::boost::unit_test::unit_test_main(&init_unit_test, argc, utf8Lines); 
    //End from boost::test's main() 

    //Clean up our mess 
    for(unsigned int idx = 0; idx < argc + 1; idx++) 
     delete [] utf8Lines[idx]; 
    delete [] utf8Lines; 

    return returnValue; 
} 

#endif 

BOOST_AUTO_TEST_CASE(TesterTest) 
{ 
    BOOST_CHECK(false); 
} 

qui est utile espoir à quelqu'un.

Billy3

Répondre

4

Je pense que le problème est que vous utilisez la version bêta VC10.

Il a un petit bug amusant où, lorsque Unicode est activé, il faut que le point d'entrée soit wmain, pas main. (Les anciennes versions vous permettaient d'utiliser à la fois wmain et main dans ces cas).

Bien sûr, cela sera corrigé dans la prochaine version bêta, mais jusque là, eh bien, c'est un problème. :)

Vous pouvez rétrograder vers VC9, désactiver Unicode ou essayer de définir manuellement le point d'entrée sur main dans les propriétés du projet.

Une autre chose que pourrait fonctionner est si vous définissez votre propre wmain stub, qui appelle principal. Je suis assez sûr que c'est un comportement techniquement indéfini, mais comme une solution de contournement pour un bogue de compilateur dans un compilateur inédit, il pourrait faire l'affaire.

+0

Yup - c'est tout. La chose étrange est --- Je n'utilise pas VC10 - J'ai mis le toolchain pour utiliser VS2008 - Je n'utilise que VS2010 pour son éditeur. Merci pour votre débogage psychique. Je travaille sur la dernière option maintenant et je posterai ici quand c'est fait. (L'application est unicode - aucun test ne vaut le coup en mode ANSI) –

+0

Ajouté mon code ci-dessus au cas où vous êtes intéressé. –

+0

Dans mon cas (VC++ 2008, application de console Windows CE), il était plus facile de simplement changer l'option de l'éditeur de liens de point d'entrée de mainWCRTStartup à mainCRTStartup. –

Questions connexes