使用静态变量进行外部测试未解析

时间:2015-11-26 20:34:10

标签: c++ visual-studio-2013 boost-test

好吧,所以我已经查看了关于堆栈溢出问题的一些问题,并且找不到任何可以解决我问题的问题。

这是我在将boost测试项目与我的生产代码链接时遇到的错误。我正在使用MSVS-2013:

  

2错误LNK2001:未解析的外部符号“private:static class std :: shared_ptr Debug :: _ Debug”(?_Debug @ Debug @@ 0V?$ shared_ptr @ VDebug @@@ std @@ A)C:\ Code \ Main.Testing \ B.OBJ
  3错误LNK1120:1个未解析的外部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;

在单独的测试项目中测试文件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 个答案:

答案 0 :(得分:0)

仍然不确定为什么测试项目没有在.cpp文件中捕获静态变量的定义,但是我找到了一种解决方法,虽然它有点hacky。

在我的测试项目中,在包含&#39; main&#39;的文件中定义,我将Debug的.cpp文件添加为#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"

它可能不是最好的解决方案,但它最终正在编译和运行。如果有人能想到一个不太常见的解决方法,请告诉我。