2011-02-17 49 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他的指针。

相关问题