Linker 基于ATL的链接器错误

Linker 基于ATL的链接器错误,linker,atl,visual-c++-2008,Linker,Atl,Visual C++ 2008,我最近在atls.lib上遇到了一个链接问题。我用以下内容更新了链接器的其他依赖项行: comctl32.lib C:\WinDDK\7600.16385.1\lib\ATL\i386\atls.lib C:\WinDDK\7600.16385.1\lib\ATL\i386\atl.lib C:\WinDDK\7600.16385.1\lib\ATL\i386\atlsd.lib 然而,现在,我开始出现这些错误 什么会导致这些问题 多谢各位 ------ Build started: Proj

我最近在atls.lib上遇到了一个链接问题。我用以下内容更新了链接器的其他依赖项行:

comctl32.lib
C:\WinDDK\7600.16385.1\lib\ATL\i386\atls.lib
C:\WinDDK\7600.16385.1\lib\ATL\i386\atl.lib
C:\WinDDK\7600.16385.1\lib\ATL\i386\atlsd.lib
然而,现在,我开始出现这些错误

什么会导致这些问题

多谢各位

------ Build started: Project: hede, Configuration: Debug Win32 ------
Linking...
atlsd.lib(externs.obj) : error LNK2005: "char const * const g_pszUpdateEventName" (?g_pszUpdateEventName@@3PBDB) already defined in atls.lib(externs.obj)
atlsd.lib(externs.obj) : error LNK2005: "char const * const g_pszAllocFileMapName" (?g_pszAllocFileMapName@@3PBDB) already defined in atls.lib(externs.obj)
atlsd.lib(externs.obj) : error LNK2005: "char const * const g_pszKernelObjFmt" (?g_pszKernelObjFmt@@3PBDB) already defined in atls.lib(externs.obj)
atlsd.lib(externs.obj) : error LNK2005: "class CAtlAllocator g_Allocator" (?g_Allocator@@3VCAtlAllocator@@A) already defined in atls.lib(externs.obj)
SettingPropPage.obj : error LNK2001: unresolved external symbol __forceAtlDllManifest
stdafx.obj : error LNK2001: unresolved external symbol __forceAtlDllManifest
trace.obj : error LNK2001: unresolved external symbol __forceAtlDllManifest
util.obj : error LNK2001: unresolved external symbol __forceAtlDllManifest
genericpropclasses.obj : error LNK2001: unresolved external symbol __forceAtlDllManifest
hede.obj : error LNK2001: unresolved external symbol __forceAtlDllManifest
hede2.obj : error LNK2001: unresolved external symbol __forceAtlDllManifest
propclasses.obj : error LNK2001: unresolved external symbol __forceAtlDllManifest
propclasses.obj : error LNK2019: unresolved external symbol __imp__AtlWinModuleAddCreateWndData@12 referenced in function "public: void __thiscall ATL::CAtlWinModule::AddCreateWndData(struct ATL::_AtlCreateWndData *,void *)" (?AddCreateWndData@CAtlWinModule@ATL@@QAEXPAU_AtlCreateWndData@2@PAX@Z)
propclasses.obj : error LNK2019: unresolved external symbol "void __stdcall ATL::__FreeStdCallThunk(void *)" (?__FreeStdCallThunk@ATL@@YGXPAX@Z) referenced in function "public: static void __cdecl ATL::_stdcallthunk::operator delete(void *)" (??3_stdcallthunk@ATL@@SAXPAX@Z)
propclasses.obj : error LNK2019: unresolved external symbol __imp__AtlWinModuleExtractCreateWndData@4 referenced in function "public: void * __thiscall ATL::CAtlWinModule::ExtractCreateWndData(void)" (?ExtractCreateWndData@CAtlWinModule@ATL@@QAEPAXXZ)
propclasses.obj : error LNK2019: unresolved external symbol "void * __stdcall ATL::__AllocStdCallThunk(void)" (?__AllocStdCallThunk@ATL@@YGPAXXZ) referenced in function "public: static void * __cdecl ATL::_stdcallthunk::operator new(unsigned int)" (??2_stdcallthunk@ATL@@SAPAXI@Z)
stdafx.obj : error LNK2019: unresolved external symbol __imp__AtlUpdateRegistryFromResourceD@20 referenced in function "public: long __stdcall ATL::CAtlModule::UpdateRegistryFromResourceDHelper(wchar_t const *,int,struct ATL::_ATL_REGMAP_ENTRY *)" (?UpdateRegistryFromResourceDHelper@CAtlModule@ATL@@QAGJPB_WHPAU_ATL_REGMAP_ENTRY@2@@Z)
stdafx.obj : error LNK2019: unresolved external symbol __imp__AtlCreateRegistrar@4 referenced in function "public: long __stdcall ATL::CAtlModule::UpdateRegistryFromResourceDHelper(wchar_t const *,int,struct ATL::_ATL_REGMAP_ENTRY *)" (?UpdateRegistryFromResourceDHelper@CAtlModule@ATL@@QAGJPB_WHPAU_ATL_REGMAP_ENTRY@2@@Z)
stdafx.obj : error LNK2019: unresolved external symbol __imp__AtlCallTermFunc@4 referenced in function "public: void __thiscall ATL::CAtlModule::Term(void)" (?Term@CAtlModule@ATL@@QAEXXZ)
Debug/hede.exe : fatal error LNK1120: 8 unresolved externals
Build log was saved at "file://c:\Users\JohnDoe\Desktop\myproject\hede\Debug\BuildLog.htm"
hede- 20 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

lib是ATL的静态库。atlsd.lib是该库的调试版本。您在同一个构建中链接到这两个,因此可以得到多个定义。此外,如果要使用atl的动态库,则应链接到atl.lib。因此,要么在发布版本中使用atl.lib,要么在调试版本中使用atls.lib。但是不要把它们混在一起。

在项目设置中,将“ATL的使用”从“动态链接到ATL”更改为“静态链接到ATL”。

我也不得不调试这个问题。由于atl.lib中缺少许多函数,因此DLL bulid似乎不起作用。 我将“使用ATL”切换为“静态链接到ATL”。之后,我只剩下3个缺少的符号,我发现这些符号是在
atlthunk.lib
中定义的。在atlbase.h中从未引用过这个。这就是为什么我加了一句

#pragma comment(lib, "atlthunk.lib")
atls.lib/atlsd.lib的debug yes/no部分之前执行
atlbase.h


之后,构建成功。

但是我的控制台输出告诉我在链接atls.lib之后链接atlsd.lib。我以前甚至不知道atlsd.lib。这可能是因为其他原因吗?@JohnDoe,我没有VC2008或Windk,但看看VC2010附带的atlbase.h,我看到了以下内容:如果项目在动态库中使用ATL,它会使用
#pragma comment(lib,“ATL.lib”)
链接到ATL.lib。如果它是调试版本,它还链接到atlsd.lib,如果发布到atls.lib。不确定为什么总是包含静态lib,但无论如何-尝试删除链接器依赖项,只包含atlbase.h。让它调用所需的LIB。如果找不到库,请将其文件夹添加到附加库目录链接器设置。您是如何解决此问题的?@Mahesh更改项目属性的。在项目属性中选择“使用ATL”。不需要包含任何内容。而且,不要使用快速版。祝你好运。在Visual Studio的更高版本中,这个选项似乎不存在了?(这里是社区)