链接错误LNK2001:未解析的外部符号(Visual Studio 2008)

时间:2014-04-03 14:06:17

标签: c++ linker-errors unresolved-external lnk2001

我有3个链接错误,我无法摆脱。

我已经在类的头文件中定义了一些自己的用户定义类型的静态公共类常量。接下来,我已经在cpp文件中声明并初始化了类常量。我可以在类本身中使用这些常量。但是,当我尝试在另一个项目中使用常量时,我​​收到一个链接错误:

error LNK2001: unresolved external symbol "public: static class EFString const CEFMldEreignis::s_typeMelderSteuern"

我不知道这里有什么问题。有人有想法吗?

非常感谢提前!

标头文件

class LIB_EXPORT CEFMldEreignis : public CBusinessObjekt
{
    ...

public:
    static const EFString s_typeMelderSteuern;

    ...
};

cpp文件

#include "EFMldEreignis.h"

const EFString CEFMldEreignis::s_typeMelderSteuern = _T("S");

我们正在使用Visual Studio 2008。 定义常量的项目将作为参考添加到另一个项目的公共属性中,以及 C ++属性中的其他包含目录。

在另一个第三个项目中,我们实际上也声明了一些静态类常量,这些常量在使用时不会产生链接错误。

链接器命令行(所有选项)

(注:EuroAllgemeineMasken是"其他"项目,其中使用常量; EuroMelder是定义和声明常量的项目。)

/OUT:"C:\Eldis3\trunk\ELDIS\Workspace\..\Debug\EuroAllgemeineMasken.dll" /INCREMENTAL     
/NOLOGO /LIBPATH:"C:\Eldis3\trunk\ELDIS\Workspace\..\Debug" 
/LIBPATH:"C:\Eldis3\trunk\ELDIS\Workspace\\..\..\Lib\External\SST" 
/LIBPATH:"C:\Eldis3\trunk\ELDIS\Workspace\\..\..\Lib\External\ELDIS" /DLL /MANIFEST 
/MANIFESTFILE:"Debug\EuroAllgemeineMasken.dll.intermediate.manifest" 
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /
PDB:"C:\Eldis3\trunk\ELDIS\Workspace\..\Debug\EuroAllgemeineMasken.pdb" 
/SUBSYSTEM:WINDOWS /DYNAMICBASE:NO     
/IMPLIB:"C:\Eldis3\trunk\ELDIS\Workspace\..\Debug\EuroAllgemeineMasken.lib" /MACHINE:X86 
/ERRORREPORT:PROMPT ..\..\ELDIS\Debug\CEDVToolsEldis.lib ..\..\ELDIS\Debug\EuroTetra.lib 
..\..\ELDIS\Debug\Services.lib ..\..\ELDIS\Debug\ServiceManager.lib 
..\..\ELDIS\Debug\CESocketUDP.lib ..\..\ELDIS\Debug\EuroLWZ.lib 
..\..\ELDIS\Debug\EuroRouting.lib ..\..\ELDIS\Debug\MassnahmeTools.lib 
..\..\ELDIS\Debug\EuroDispo.lib ..\..\ELDIS\Debug\EuroMass.lib 
..\..\ELDIS\Debug\BCGControlBar.lib ..\..\ELDIS\Debug\EuroFlug.lib 
..\..\ELDIS\Debug\EuroMFCTools.lib ..\..\ELDIS\Debug\EuroLog.lib 
..\..\ELDIS\Debug\EuroGis.lib ..\..\ELDIS\Debug\EuroDialoge.lib 
..\..\ELDIS\Debug\CECrystalReport.lib ..\..\ELDIS\Debug\EuroInfo.lib 
..\..\ELDIS\Debug\EuroIO.lib ..\..\ELDIS\Debug\EuroPers.lib 
..\..\ELDIS\Debug\EuroStatus.lib ..\..\ELDIS\Debug\CELTextEldis.lib 
..\..\ELDIS\Debug\EuroBers.lib ..\..\ELDIS\Debug\EuroMelder.lib 
..\..\ELDIS\Debug\EuroLeit.lib ..\..\ELDIS\Debug\LOVDialog.lib 
..\..\ELDIS\Debug\EuroFunk.lib ..\..\ELDIS\Debug\EuroEsta.lib 
..\..\ELDIS\Debug\EuroOrt.lib ..\..\ELDIS\Debug\EuroEinsatz.lib 
..\..\ELDIS\Debug\Gms.lib ..\..\ELDIS\Debug\GMTs.lib ..\..\ELDIS\Debug\EuroAdmin.lib 
..\..\ELDIS\Debug\EuroOber.lib ..\..\ELDIS\Debug\EFBusiness.lib 
..\..\ELDIS\Debug\EuroTools.lib ..\..\ELDIS\Debug\DBAccess.lib 
..\..\ELDIS\Debug\DynamicWindows.lib

1 个答案:

答案 0 :(得分:1)

dllexport和dllimport语句存在问题。 某些项目共享相同的LIB_EXPORT指令。这被定义为:

#if defined(_USRDLL) || (defined(_AFXDLL) && defined(_AFXEXT))
    #define LIB_EXPORT __declspec(dllexport)
#else
    #define LIB_EXPORT __declspec(dllimport)
#endif

然而,这似乎无法正常工作。我们现在为每个项目定义一个单独的指令,如下所示:

#ifdef BUILD_EUROMELDER_DLL
    #undef  EUROMELDER_EXPORT
    #define EUROMELDER_EXPORT __declspec (dllexport)
#else
    #undef  EUROMELDER_EXPORT
    #define EUROMELDER_EXPORT __declspec (dllimport)
#endif

这解决了这个问题。