TimGallin Ответов: 2

Ошибка ссылки Log4cplus 2001 в VS2013


Я гарантирую, что скомпилировал проект log4cplus как динамическую библиотеку с кодировкой Unicode(Debug_Unicode), и мой собственный тестовый проект также был настроен на кодировку Unicode. Оба они скомпилированы по отладочной модели. Я читал много подобных вопросов, но все еще не могу решить эту проблему... Ниже приведен мой тестовый код :
#include "Include/log4cplus/loggingmacros.h"
#include "Include/log4cplus/configurator.h"
#include "Include/log4cplus/helpers/loglog.h"
#include "Include/log4cplus/helpers/stringhelper.h"
#include "Include/log4cplus/helpers/fileinfo.h"
#include "Include/log4cplus/loggingmacros.h"
#include "Include/log4cplus/initializer.h"
#pragma comment(lib, "log4cplusUD.lib")
using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
int main(int argc, wchar_t* argv[])
{

    cout << LOG4CPLUS_TEXT("Entering main()...") << endl;
    log4cplus::Initializer initializer;
    LogLog::getLogLog()->setInternalDebugging(true);
    Logger root = Logger::getRoot();
    try {
        PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("E:\\log4cplus.properties"));
        Logger fileCat = Logger::getInstance(LOG4CPLUS_TEXT("filelogger"));

        LOG4CPLUS_WARN(root, LOG4CPLUS_TEXT("Testing...."));
        LOG4CPLUS_WARN(root, LOG4CPLUS_TEXT("Writing messages to log...."));
        for (int i = 0; i<10000; ++i)
            LOG4CPLUS_WARN(fileCat, LOG4CPLUS_TEXT("This is a WARNING...")
            << i);

        // Test that DOS EOLs in property files get removed.
#define TEST_TEXT LOG4CPLUS_TEXT ("this is a test with DOS EOL-->")
        tistringstream propsStream(
            LOG4CPLUS_TEXT("text=") TEST_TEXT LOG4CPLUS_TEXT("\r\n"));
        Properties props(propsStream);
        LOG4CPLUS_ASSERT(root,
            props.getProperty(LOG4CPLUS_TEXT("text")) == TEST_TEXT);
    }
    catch (...) {
        tcout << LOG4CPLUS_TEXT("Exception...") << endl;
        LOG4CPLUS_FATAL(root, LOG4CPLUS_TEXT("Exception occured..."));
    }
http://www.codeproject.com/Questions/ask.aspx#
    cout << LOG4CPLUS_TEXT("Exiting main()...") << endl;
    return 0;
}

Я просто копирую этот код из "propertyconfig_test" в log4cplus, файл lib и dll также компилируется с "Debug_Unicode", когда я компилирую свой собственный тестовый проект, то возникает ошибка ссылки:
  error LNK2001: unresolved external symbol "class std::basic_ostream<wchar_t,struct std::char_traits<wchar_t=""> > & log4cplus::tcout"
(?tcout@log4cplus@@3AAV?$basic_ostream@_WU?$char_traits@_W@std@@@std@@A)
       E:\TestCode\1026(thttpd)\thttpd\thttpd\thttpd.obj   thttpd

Только что я обнаружил,что если я комментирую эти предложения,которые включают функцию "tcout", то все в порядке, этот пример о propertyconfig_test работает хорошо, почему?

Что я уже пробовал:

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

2 Ответов

Рейтинг:
2

Jochen Arndt

По крайней мере, более старые версии Visual Studio не имеют определений для tcout.

Вы можете попытаться добавить их перед включением заголовочных файлов log4cplus:

#ifdef _UNICODE 
#define tcout std::wcout 
#define tcerr std::wcerr 
#else 
#define tcout std::cout 
#define tcerr std::cerr 
#endif 


Рейтинг:
0

KarstenK

Очевидная проблема заключается в том, что реализации tcout не существует. Почему вы не используете cout?

Проверьте, где объявлен tcout и почему он не скомпилирован или не реализован. Я предполагаю, что некоторые охраняющие макросы находятся поблизости.