好吧,所以我已经查看了关于堆栈溢出问题的一些问题,并且找不到任何可以解决我问题的问题。
这是我在将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()
当我从上面的文件中删除静态变量时,代码编译并且测试运行正常。当我排除测试项目但包含静态变量时,解决方案也会编译,链接和运行正常,所以我假设它与我的设置有关。我一直在修补它已经有一段时间了,我很难过。我错过了一些明显的东西吗?
答案 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"
它可能不是最好的解决方案,但它最终正在编译和运行。如果有人能想到一个不太常见的解决方法,请告诉我。