2011-02-17 52 views
0

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

  1. 此錯誤是沒有看到在Linux上,用RHEL5 gcc4.1.2構建相同的應用程序
  2. 通過相同的出口SYMB定義另一類是可用..

上午什麼我做錯了?這是關於靜態關鍵字,或者它是出口符號?我懷疑是後者,但後來我有另一個類不涉及靜態變量,這些靜態變量在我的第三方庫中被類似地定義,並且通過不會導致鏈接器錯誤的相同的導出符號進行訪問,如上所述。 這讓我困惑。

+1

不應該在類上使用`__declspec(dllexport)`或`__declspec(dllimport)`。爲客戶端定義一個C接口;否則只有使用完全相同編譯器/編譯器版本/編譯器設置的人才能使用該類,這首先會破壞動態鏈接的關鍵點。 – 2011-02-17 03:49:53

+1

__declspec(dllexport)發生了什麼? – 2011-02-17 03:50:29

回答

1

不應該__declspec(dllimport)__declspec(dllexport)

0

我想出了這個答案。是的,它與OJ寫的有關。基本上我錯過了一個cmake定義,它激活了一個將符號定義爲__declspec(dllexport)的條件。無論如何感謝@OJ他的指針。

相關問題