【问题标题】:But I don't want that .lib or .exp file for my COM library!但我不希望将 .lib 或 .exp 文件用于我的 COM 库!
【发布时间】:2009-09-16 08:34:27
【问题描述】:

在使用 VisualStudio 生成 COM dll 时,我真正需要的是要从 dll 本身导出的 DllCanUnloadNow 符号(和三个相关符号)。 没有人会链接到我的库,所以我(根本)对 .lib 文件和 .exp 文件不感兴趣。

但是,我没有设法禁止创建这些文件。 (注意:我确实知道如何在构建后步骤中删除它们)

这些是我的链接器参数:

/OUT:"u:/cada-nt/bin/PData.dll" 
/INCREMENTAL:NO 
/NOLOGO 
/DLL 
/MANIFEST:NO 
/DEF:"PData.def" 
/DEBUG 
/PDB:"u:/cada-nt/pdb/PData.pdb" 
/ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
                    advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib 
                    odbc32.lib odbccp32.lib

问题:

  • 有没有人成功生成 .lib 和 .exp 文件?
  • 有人知道为什么会生成这些文件吗?

【问题讨论】:

    标签: c++ visual-studio


    【解决方案1】:

    Visual Studio 的链接器有一个/IMPLIB 选项,可让您指定.lib.exp 文件的输出位置。

    您可以在项目的属性中修改此选项:

    Configuration Properties > Linker > Advanced > Import Library
    

    您可以将其设置为以下内容,例如:

    $(Configuration)\$(TargetName).lib
    

    链接器将使用与.lib 相同的名称创建.exp 文件。

    【讨论】:

    • 这不是 OP 要求的。他根本不想要链接器创建的那些文件,而不是在不同的文件夹中
    【解决方案2】:

    COM 库中有一些函数声明为 __declspec(dllexport)。这意味着它们被导出(可能被 GetProcAdress 函数使用)并且链接器认为需要与这个动态库链接(无论是 exe 还是 dll - 一般结构都是一样的)并创建 *.lib和 *.exp 文件。

    为避免创建这些文件,您需要从函数声明中删除所有 __declspec(dllexport)

    【讨论】:

    • 这已针对 Visual Studio 2013 默认编译器和链接器进行了验证。目标平台是 x64 或 x86 或 Windows。
    【解决方案3】:

    不确定如何关闭它们,但您可以执行构建后步骤来移除它们,如下所示:

    del $(OutDir)\$(ProjectName).lib
    del $(OutDir)\$(ProjectName).exp
    

    (在 VS2008 上是 [Project]->[Properties],然后是 Configuration Properties->Build Events->Post-Build Events)

    (注意我知道你知道如何做到这一点,但这个答案可能会帮助下一个谷歌人......)

    【讨论】:

    • 这种变通方法的副作用是每次都会进行编译,因为编译器想要重新创建文件。
    【解决方案4】:

    /NOIMPLIB 将阻止生成.lib 文件。 我不知道如何避免.exp 文件。

    【讨论】:

      【解决方案5】:

      为什么生成这些文件有问题?当然,如果人们不打算直接链接到他们,您需要做的就是不要分发这些文件,而只需分发 DLL。

      【讨论】:

      • 没有紧急问题。我什至有一个解决方法。链接器生成它们只是没用的。这些文件自动在输出文件夹中,在我需要分发的 dll 旁边。它杂乱无章。很烦人。
      • -1:这是一个完全合理的要求。我也要求,出于同样的原因,这些文件很烦人。
      • @demoncodemonkey:习惯吧。我怀疑你也想摆脱那些烦人的 obj 文件……让我震惊的是,有些人担心一些如此无关紧要但最终却完全有用的东西。
      • 不,obj 文件并不那么烦人,因为它们位于中间目录中。 exp 和 lib 在我漂亮的干净输出目录中......这就是区别。
      • 我的用例是 100% 相同的。我不想生成这些文件。
      猜你喜欢
      • 2019-06-13
      • 2023-03-12
      • 2015-03-20
      • 1970-01-01
      • 2021-09-12
      • 2016-01-13
      • 1970-01-01
      • 2017-12-18
      • 2021-11-27
      相关资源
      最近更新 更多