DLL依赖自己的Import Library,如何避免?

Posted

技术标签:

【中文标题】DLL依赖自己的Import Library,如何避免?【英文标题】:Dependency from DLL to own Import Library, how to avoid? 【发布时间】:2011-11-14 09:38:46 【问题描述】:

我正在从 IDL 文件构建代理/存根库,由于某种原因,构建驱动程序认为链接期间生成的导入库是链接的输入文件,导致每次都重新链接项目(为便于阅读而缩短了路径名):

10:05:33.764 1>
Target "Link: (TargetId:66)" in file "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets" from project "[...]\VersionControl.vcxproj" (target "_Link" depends on it):
Using "Link" task from assembly "Microsoft.Build.CppTasks.Win32, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "Link" (TaskId:26)
    Write Tracking Logs: (TaskId:26)
[...]
    Outputs for [...]\DEBUG\DLLDATA.OBJ|[...]\DEBUG\VERSIONCONTROL.DLL.EMBED.MANIFEST.RES|[...]\DEBUG\VERSIONCONTROL_I.OBJ|[...]\DEBUG\VERSIONCONTROL_P.OBJ: (TaskId:26)
    [...]\DEBUG\VERSIONCONTROL.ILK (TaskId:26)
    [...]\DEBUG\VERSIONCONTROL.DLL (TaskId:26)
    [...]\DEBUG\VERSIONCONTROL.DLL.INTERMEDIATE.MANIFEST (TaskId:26)
    [...]\DEBUG\VERSIONCONTROL.PDB (TaskId:26)
    Inputs for [...]\DEBUG\DLLDATA.OBJ|[...]\DEBUG\VERSIONCONTROL.DLL.EMBED.MANIFEST.RES|[...]\DEBUG\VERSIONCONTROL_I.OBJ|[...]\DEBUG\VERSIONCONTROL_P.OBJ: (TaskId:26)
    [...]\LIB\RPCRT4.LIB (TaskId:26)
    [...]\LIB\KERNEL32.LIB (TaskId:26)
    [...]\LIB\USER32.LIB (TaskId:26)
    [...]\LIB\GDI32.LIB (TaskId:26)
    [...]\LIB\WINSPOOL.LIB (TaskId:26)
    [...]\LIB\COMDLG32.LIB (TaskId:26)
    [...]\LIB\ADVAPI32.LIB (TaskId:26)
    [...]\LIB\SHELL32.LIB (TaskId:26)
    [...]\LIB\OLE32.LIB (TaskId:26)
    [...]\LIB\OLEAUT32.LIB (TaskId:26)
    [...]\LIB\UUID.LIB (TaskId:26)
    [...]\LIB\ODBC32.LIB (TaskId:26)
    [...]\LIB\ODBCCP32.LIB (TaskId:26)
    [...]\DEBUG\VERSIONCONTROL.DLL.EMBED.MANIFEST.RES (TaskId:26)
    [...]\DEBUG\DLLDATA.OBJ (TaskId:26)
    [...]\DEBUG\VERSIONCONTROL_I.OBJ (TaskId:26)
    [...]\DEBUG\VERSIONCONTROL_P.OBJ (TaskId:26)
    [...]\SYSTEM32\TZRES.DLL (TaskId:26)
    [...]\SORTING\SORTDEFAULT.NLS (TaskId:26)
    [...]\DEBUG\VERSIONCONTROL.EXP (TaskId:26)
    [...]\DEBUG\VERSIONCONTROL.LIB (TaskId:26)
    [...]\VERSIONCONTROL.DEF (TaskId:26)
    [...]\LIB\MSVCRTD.LIB (TaskId:26)
    [...]\LIB\OLDNAMES.LIB (TaskId:26)
    Source compilation required: input [...]\DEBUG\VERSIONCONTROL.LIB is newer than output [...]\DEBUG\VERSIONCONTROL.DLL. (TaskId:26)

该项目被设置为一个普通的 DLL 项目,设置保留为默认值。知道为什么 MSBuild 决定将这些生成的文件视为输入,以及我该如何解决这个问题?

【问题讨论】:

"VersionControl" 是代理/存根 DLL 的不寻常名称。我的水晶球说你的主要 COM 服务器项目也被命名为“VersionControl”。 不,那只是接口名称。目前,唯一的实现存在于主应用程序中,COM 仅用于将长时间运行的操作移动到单独的线程中。在某个时候,我计划将代码拆分为一个单独的 DLL,该 DLL 将以其接口的 VC 系统命名,并注册在一个类别中。 我一般会构建一个项目,其中包含接口的IDL,它构建P/S库,每个实现都从那里导入IDL并定义coclasses。 您是否有任何机会错过了#define 并且您不小心__declspec(dllimport) 恢复了您自己的一些功能?或者类似地,您有一个@pragma(comment, lib) 用于包含在 DLL 构建中的代码中的 .lib?我会尝试#erroring 头文件的所有导入部分。 (或者这只是从 IDL 生成的存根代码?) 这只是存根代码,加上一个.def 文件来导出通常的嫌疑人。 【参考方案1】:

这是在黑暗中拍摄的,但值得一看...

打开您的 vcxproj 文件并查找 @(Midl) 项。通过尝试这三个项目元数据之一来修改它,看看行为如何变化,它可能会让你走上正确的道路:

  <Midl Include="My.idl">
    <LinkCompiled>false</LinkCompiled>
    <LibCompiled>false</LibCompiled>
    <ImpLibCompiled>false</ImpLibCompiled>
  </Midl>

【讨论】:

以上是关于DLL依赖自己的Import Library,如何避免?的主要内容,如果未能解决你的问题,请参考以下文章

import _ssl DLL load failed(pycharm 或者anaconda)

JNA:本机库依赖项和JAR提取

在Microsoft共享dll上使用#import指令

如何查看exe或dll的依赖库dll

如何从library依赖库的aar文件中去除不用的jar包

使用 maven 将 dll 添加到 java.library.path