尝试将应用程序链接到“第三方库”时,我收到以下链接器错误,其中我自己构建了有问题的第三方库。这里是我得到的错误:Microsoft Visual Studio 2008 C++错误LNK2001,Windows Vista 64位
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" ([email protected]@[email protected]@[email protected]?
[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@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上的链接器错误。什么困扰 我是
- 此错误是没有看到在Linux上,用RHEL5 gcc4.1.2构建相同的应用程序
- 通过相同的出口SYMB定义另一类是可用..
上午什么我做错了?这是关于静态关键字,或者它是出口符号?我怀疑是后者,但后来我有另一个类不涉及静态变量,这些静态变量在我的第三方库中被类似地定义,并且通过不会导致链接器错误的相同的导出符号进行访问,如上所述。 这让我困惑。
不应该在类上使用`__declspec(dllexport)`或`__declspec(dllimport)`。为客户端定义一个C接口;否则只有使用完全相同编译器/编译器版本/编译器设置的人才能使用该类,这首先会破坏动态链接的关键点。 – 2011-02-17 03:49:53
__declspec(dllexport)发生了什么? – 2011-02-17 03:50:29