Boost :: Test - генерация Main ()? - PullRequest
4 голосов
/ 09 августа 2009

Я немного запутался в настройке библиотеки буст-тестов. Вот мой код:

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

Мой компилятор генерирует удивительно полезное сообщение об ошибке:

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

Кажется, что библиотека Boost :: Test не генерирует функцию main () - у меня сложилось впечатление, что она делает это всякий раз, когда определяется BOOST_TEST_MODULE. Но ... ошибка компоновщика продолжается.

Есть идеи?

Billy3

РЕДАКТИРОВАТЬ: Вот мой код для обхода ошибки, описанной в правильном ответе ниже:

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

Надеюсь, это кому-нибудь пригодится.

Billy3

1 Ответ

4 голосов
/ 09 августа 2009

Мне кажется, проблема в том, что вы используете бета-версию VC10.

Имеется небольшая забавная ошибка, когда при включении Юникода требуется, чтобы точка входа была wmain, а не main. (Старые версии позволяли вам использовать и wmain, и main в этих случаях).

Конечно, это будет исправлено в следующей бета-версии, но до тех пор, ну, это проблема. :)

Вы можете либо перейти на VC9, отключить Юникод или попробовать вручную установить точку входа на main в свойствах проекта.

Еще одна вещь, которую может сработать, - это если вы определите свою собственную заглушку wmain, которая вызывает main. Я почти уверен, что это технически неопределенное поведение, но в качестве обходного пути для ошибки компилятора в невыпущенном компиляторе это может помочь.

...