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

Linking error LNK2001: unresolved external symbol (Visual Studio 2008)

提问人:Lólindir 提问时间:4/3/2014 最后编辑:πάντα ῥεῖLólindir 更新时间:4/8/2014 访问量:12364

问:

我有 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
C++ 链接器错误未 解决 - 外部 LNK2001

评论

1赞 πάντα ῥεῖ 4/3/2014
如何将.cpp文件(或包含项目的库)链接到“其他”项目?
0赞 Lólindir 4/3/2014
我们使用的是 Visual Studio 2008。定义常量的项目将作为引用添加到其他项目的公共属性中,并在 C++ 属性中添加其他包含目录。如果这就是你的意思。在另一个第三个项目中,我们实际上也声明了一些静态类常量,这些常量在使用它们时不会出现链接错误。您希望我粘贴命令行选项作为回复吗?
0赞 πάντα ῥεῖ 4/3/2014
比在回复的评论中发布其他信息更好的是编辑您的问题并将其放在那里。我可以认为它包含诊断您的问题的有用信息。
1赞 Lólindir 4/3/2014
使用链接器命令行选项修改了问题。
0赞 πάντα ῥεῖ 4/3/2014
我不太确定这是否适用于 MSVC-Linker,但对于 GCC,在某些情况下,库的指定顺序很重要(在链接到它们之前必须看到符号)。也许这有帮助/值得调查。

答:

1赞 Lólindir 4/8/2014 #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

这样就解决了问题。