【问题标题】:ATL Based Linker Errors基于 ATL 的链接器错误
【发布时间】:2015-09-30 03:53:13
【问题描述】:

我最近遇到了与 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 ==========

【问题讨论】:

  • 你是怎么解决这个问题的?
  • @Mahesh 更改您的项目属性。在项目属性中选择“使用 ATL”。不需要包括任何东西。并且,不要使用特快版。祝你好运。

标签: linker atl visual-c++-2008


【解决方案1】:

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

【讨论】:

  • 该选项似乎在更高版本的 Visual Studio 中消失了? (此处为 VS 2019 社区)
【解决方案2】:

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

#pragma comment(lib, "atlthunk.lib")

atls.lib/atlsd.lib 的调试是/否部分之前发送给atlbase.h

之后构建成功。

【讨论】:

    【解决方案3】:

    atls.lib 是 ATL 的静态库。 atlsd.lib 是该库的调试版本。您在同一个版本上链接到两者,因此您获得了多个定义。此外,如果您想使用 ATL 的动态库,您应该链接到 atl.lib。因此,要么使用 atl.lib,要么在发布版本中使用 atls.lib,在调试版本中使用 atlsd.lib。但不要将它们混合在一起。

    【讨论】:

    • 但我的控制台输出告诉我在链接 atls.lib 后链接 atlsd.lib。我以前什至不知道 atlsd.lib。这可能是因为其他原因吗?
    • @JohnDoe,我没有VC2008或WinDDK,但是查看VC2010附带的atlbase.h,我看到以下内容:如果项目在动态库中使用ATL,它链接到atl.lib 使用#pragma comment(lib, "atl.lib")。如果是调试版本,它还链接到 atlsd.lib,如果是发布到 atls.lib。不知道为什么总是包含静态库,但无论如何 - 尝试删除链接器依赖项,只包含 atlbase.h。让它召唤所需的库。如果找不到库,请将其文件夹添加到附加库目录链接器设置。
    猜你喜欢
    • 2012-04-24
    • 2020-07-22
    • 2015-10-12
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2013-09-19
    相关资源
    最近更新 更多