2015-11-26 1 views
0

Хорошо, поэтому я просмотрел ряд вопросов, заданных в отношении переполнения стека по этому вопросу, и не смог найти ничего, что вполне отвечает моей проблеме.Ускоренный тест нерегулируемый внешний со статической переменной

Это ошибка, которую я получаю при связывании проекта тестового тестирования с моим производственным кодом. Я использую МСВС-2013:

2 error LNK2001: unresolved external symbol "private: static class std::shared_ptr Debug::_Debug" ([email protected]@@[email protected]@@@[email protected]@A) C:\Code\Main.Testing\B.obj
3 error LNK1120: 1 unresolved externals C:\Code\Main.Testing\Debug\Main.Testing.exe

Вот код вызывает ошибку:

debug.h:

#pragma once 
#include <string> 
#include <memory> 
class Debug 
{ 
    private: 
    static std::shared_ptr<Debug> _Debug; 

    public: 
    static std::shared_ptr<Debug> Instance() 
    { 
     if (!_Debug) 
     { 
      _Debug.reset(new Debug); 
     } 

     return _Debug; 
    } 

    Debug() {} 
    ~Debug() {} 
    void Exit(std::string sMessage) 
    { 
     //Do stuff. 
     return; 
    } 
}; 

Debug.cpp:

#include "Debug.h" 

std::shared_ptr<Debug> Debug::_Debug; 

Test файл B.cpp в отдельном тестовом проекте:

#pragma once 
#define BOOST_TEST_DYN_LINK 

#include <boost\test\unit_test.hpp> 
#include "<path-to-folder>/Debug.h" 

BOOST_AUTO_TEST_SUITE(B) 

BOOST_AUTO_TEST_CASE(testCaseB) 
{ 
    Debug::Instance()->Exit("blah"); 
} 

BOOST_AUTO_TEST_SUITE_END() 

Код компилируется, и тесты выполняются нормально, когда я удаляю статическую переменную из вышеуказанного файла. Решение также компилирует, связывает и работает нормально, когда я исключаю тестовый проект, но включаю статическую переменную, поэтому я предполагаю, что это что-то с моей настройкой. Я некоторое время занимался этим, и я был в тупике от того, что это может быть. Мне что-то не хватает?

+1

Единственная проблема, о которой я могу думать, заключается в том, что 'Debug.cpp' не соединяется вместе с этим« отдельным тестовым проектом », в котором находится B.cpp. (Я надеюсь, вы попытались избавиться от 'typedef std :: shared_ptr DebugPtr;' и заменить все ссылки на 'DebugPtr' на' std :: shared_ptr 'перед тем, как задать вопрос, верно?) –

+0

@MikeNakis Да, это было одна из первых вещей, которые я пробовал, когда я сталкивался с этой ситуацией раньше. Однако это не изменило результат. Я возьму typedef в моем примере, чтобы избежать этой путаницы. –

ответ

0

По-прежнему не уверен, почему проект тестирования не нашел определения статической переменной в файле .cpp, но я нашел обходное решение, хотя оно довольно хаки.

В моем тестовом проекте в файле, содержащем «основное» определение, я добавил файл .cpp Debug как #include (где статическая переменная определена). Вроде так:

#define BOOST_TEST_DYN_LINK 

#ifndef BOOST_TEST_MODULE ProjectTesting 
#define BOOST_TEST_MODULE ProjectTesting 
#endif 
#ifndef BOOST_TEST_MAIN 
#define BOOST_TEST_MAIN 
#endif 

#include <boost\test\unit_test.hpp> 
#include "<path-to-folder>/Debug.cpp" 

Это, вероятно, не лучшее решение, но оно окончательно компилируется и работает правильно. Если кто-нибудь может подумать о менее хакерском обходном пути, дайте мне знать.