【发布时间】:2015-11-26 20:34:09
【问题描述】:
好的,所以我已经查看了有关堆栈溢出问题的一些问题,但找不到任何可以完全回答我的问题的问题。
这是我在将 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
这是导致错误的代码:
调试.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;
}
};
调试.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()
当我从上述文件中删除静态变量时,代码编译并且测试运行良好。当我排除测试项目但包含静态变量时,该解决方案也可以编译、链接和运行良好,所以我假设它与我的设置有关。我一直在修补它一段时间,对它可能是什么感到困惑。我错过了什么明显的东西吗?
【问题讨论】:
-
我能想到的唯一问题是
Debug.cpp没有与 B.cpp 所在的“单独的测试项目”链接在一起。 (我相信您在提问之前已经尝试摆脱typedef std::shared_ptr<Debug> DebugPtr;并将所有对DebugPtr的引用替换为std::shared_ptr<Debug>,对吧?) -
@MikeNakis 是的,这是我尝试过的第一件事,因为我以前遇到过这种情况。不过,这并没有改变结果。我将在我的示例中去掉 typedef 以避免这种混淆。
标签: c++ visual-studio-2013 boost-test