Microsoft Visual Studio 2008 C ++错误LNK2001,Windows Vista 64位

时间:2011-02-17 03:46:13

标签: c++ visual-studio-2008 windows-vista 64-bit

尝试将应用程序链接到“第三方库”时,我收到以下链接器错误,我自己构建了第三方库。这是我得到的错误:

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上的链接器错误。什么困扰 我是那个

  1. 在使用RHEL5 gcc4.1.2
  2. 构建的相同应用程序上看不到此错误
  3. 通过相同导出符号定义的另一个类可用..
  4. 我做错了什么?这与static关键字有关,还是导出符号?我怀疑是后者,但后来我有另一个不涉及静态变量的类,它在我的第三方库中被类似地定义,并且通过相同的导出符号访问,这不会导致链接器错误,如上所述。 这让我很困惑。

2 个答案:

答案 0 :(得分:1)

不应__declspec(dllimport)__declspec(dllexport)

答案 1 :(得分:0)

我想出了答案......是的,它与OJ的写作有关。基本上我错过了一个cmake定义,它激活了一个将符号定义为__declspec(dllexport)的条件。无论如何,谢谢@OJ的指针。