2009-08-09 9 views
4

Ich bin ein wenig verwirrt beim Einrichten der Boost-Test-Bibliothek. Hier ist mein Code:Boost :: Test - Generierung von 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); 
} 

Mein Compiler generiert die wunderbar nützliche Fehlermeldung:

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 

Es scheint, dass die Boost-:: Test-Bibliothek ist nicht eine Funktion main() zu erzeugen - ich unter war der Eindruck es macht dies immer wenn BOOST_TEST_MODULE definiert ist. Aber ... der Linker Fehler geht weiter.

Irgendwelche Ideen?

billy3

EDIT: Hier ist mein Code, um den Fehler unten in der richtigen Antwort beschrieben zu arbeiten:

#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); 
} 

Hoffnung, dass jemand hilfreich ist.

billy3

Antwort

4

Ich denke, das Problem ist, dass Sie die VC10 Beta verwenden.

Es hat einen lustigen kleinen Fehler, bei dem, wenn Unicode aktiviert ist, der Einstiegspunkt wmain, nicht main sein muss. (Ältere Versionen erlaubten Ihnen, in diesen Fällen sowohl wmain als auch main zu verwenden).

Natürlich wird dies in der nächsten Beta behoben werden, aber bis dahin, nun, es ist ein Problem. :)

Sie können entweder auf VC9 herunterstufen, Unicode deaktivieren oder versuchen, den Einstiegspunkt in den Projekteigenschaften manuell auf main zu setzen.

Eine andere Sache, die könnte Arbeit ist, wenn Sie Ihren eigenen WMain-Stub definieren, die Main ruft. Ich bin ziemlich sicher, dass dies technisch undefiniert Verhalten ist, aber als Workaround für einen Compiler-Fehler in einem nicht freigegebenen Compiler könnte es den Trick tun.

+0

Yup - das ist es. Das komische Ding ist --- ich verwende VC10 nicht - ich habe die Werkzeugkette eingestellt, um VS2008 zu benutzen - ich verwende nur VS2010 für seinen Herausgeber. Danke für dein psychisches Debugging. Ich arbeite jetzt an der letzten Option und werde hier posten, wenn es fertig ist. (App ist Unicode - kein Test ist es wert im ANSI-Modus) –

+0

Mein Code oben hinzugefügt, falls Sie interessiert sind. –

+0

In meinem Fall (VC++ 2008, Windows CE-Konsolenanwendung) war es einfacher, nur die Einstiegspunkt-Linkeroption von mainWCRTStartup zu mainCRTStartup zu ändern. –

Verwandte Themen