尝试将应用程序链接到“第三方库”时,我收到以下链接器错误,我自己构建了第三方库。这是我得到的错误:
error LNK2001: unresolved external symbol "public: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const namesp::classname::VARIABLE" (?VARIABLE@classname@namesp@@2V?$basic_string@DU?
$char_traits@D@std@@V?$allocator@D@2@@std@@B) <path\to\mylib>.dll : fatal error LNK1120: 1 unresolved externals
有问题的变量是在作为第三方库的一部分构建的类中定义的。以下是关于相关变量的类标题的片段:
namespace namesp {
class MY_EXPORT classname {
public:
static const std::string VARIABLE;
};
}
,而cpp的相应片段如下:
#include <namesp/classname.hpp>
namespace namesp {
const std::string classname::VARIABLE = "VARIABLE";
}
导出符号在单独的标题中定义如下:
#if defined(WINDOWS) && defined(SHARED)
#if(COND)
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT __declspec(dllimport)
#endif
#else
#define MY_EXPORT
#endif
最后,我在我的应用程序cpp中使用它,如下所示:
#include <namesp/classname.hpp>
namespace appnamesp {
appclass::somefunc() {
namesp::classname cn; //-Compiles
namesp::anotherclass ac; //-Compiles
ac.func(); //-Compiles
std::string s = namesp::classname::VARIABLE; //-Linker error
other stuff;
}
}
这导致Windows 64位Vista,MS VS2008上的链接器错误。什么困扰 我是那个
我做错了什么?这与static关键字有关,还是导出符号?我怀疑是后者,但后来我有另一个不涉及静态变量的类,它在我的第三方库中被类似地定义,并且通过相同的导出符号访问,这不会导致链接器错误,如上所述。 这让我很困惑。
答案 0 :(得分:1)
不应__declspec(dllimport)
为__declspec(dllexport)
?
答案 1 :(得分:0)
我想出了答案......是的,它与OJ的写作有关。基本上我错过了一个cmake定义,它激活了一个将符号定义为__declspec(dllexport)的条件。无论如何,谢谢@OJ的指针。