嘗試將應用程序鏈接到「第三方庫」時,我收到以下鏈接器錯誤,其中我自己構建了有問題的第三方庫。這裏是我得到的錯誤: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